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

时间:2012-02-20 02:05:26

标签: 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().getFields())
          {
              //Save each field to a file
          }
     }
}

我想只获得属于AnotherClass的Y和Z.但上面也给了我X.

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

过滤掉每个字段的名称会使其失败,因为有超过200个。

4 个答案:

答案 0 :(得分:7)

您只能使用getDeclaredFields.获取在类中声明的字段。它将排除继承的字段。

答案 1 :(得分:2)

您可以根据Field的{​​{1}}:

进行过滤
getDeclaredClass()

这只为你的例子挑选了public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) { final List<Field> l = new ArrayList<Field>(); for (Field f : c.getFields()) if (f.getDeclaringClass().equals(c)) l.add(f); return l; } y

答案 2 :(得分:1)

对于某些功能,可能有更简洁的方法来执行此操作,但明显的答案(以及我过去所做的)是找到this.getClass().getFields()和{{1之间的差异数组。

答案 3 :(得分:1)

使用公开Field[] getDeclaredFields()

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

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