Java反射:仅获取属于当前类的字段

Java反射:仅获取属于当前类的字段,java,class,reflection,field,Java,Class,Reflection,Field,如何获取仅与当前类而不是其所有父类关联的字段 public class BaseClass() { public int x = 0; } public class AnotherClass() extends BaseClass { public int y = -1; public int z = -2; public void doStuff() { for(Field f : this.getClass().get

如何获取仅与当前类而不是其所有父类关联的字段

public class BaseClass()
{
     public int x = 0;
}

public class AnotherClass() extends BaseClass
{
     public int y = -1;
     public int z = -2;

     public void doStuff()
     {
          for(Field f : this.getClass().getFields())
          {
              //Save each field to a file
          }
     }
}
我只想得到Y和Z,它们属于另一个类。但是上面也给了我X

这意味着替换必须键入我要保存的每个值。它没有以任何典型的格式保存。它必须这样保存,所以不要建议以其他方式保存字段


过滤掉每个字段的名称将无法达到此目的,因为有200多个字段。

可能有一种更干净的方法可以通过一些函数的标志来实现这一点,但一个显而易见的答案(以及我过去所做的)是找到
this.getClass().getFields()和
super.getClass().getFields()之间的区别
数组。

您可以根据
字段的
getDeclaredClass()
进行筛选:

公共静态列表字段直接声明在(c类){
最终列表l=新的ArrayList();
对于(字段f:c.getFields())
如果(f.getDeclaringClass()等于(c))
l、 添加(f);
返回l;
}

这只选择了
y
z
作为示例。

您只能获取类中声明的字段,它将排除继承的字段。

使用公共
字段[]getDeclaredFields()

返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段

      Field[] fields = AnotherClass.class.getDeclaredFields();
      for(Field f : fields){
          System.out.println(f.getName());
      }

蒂希。我在提供的代码示例上测试了
getDeclaredFields()
,发现它返回了三个元素,因此以不正确为由拒绝了它。(是的,这比阅读文档容易。)然而,我将示例代码粘贴为一个内部类,第三个字段不是BaseClass.x,而是超类。这是$0引用。阅读?呸!
      Field[] fields = AnotherClass.class.getDeclaredFields();
      for(Field f : fields){
          System.out.println(f.getName());
      }