【问题标题】:Java - Reflection: Get fields belonging to current class onlyJava - 反射:仅获取属于当前类的字段
【发布时间】:2012-02-20 02:05:26
【问题描述】:

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

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 个。

【问题讨论】:

    标签: java class reflection field


    【解决方案1】:

    你只能获取类中声明getDeclaredFields.的字段,它会排除继承的字段。

    【讨论】:

      【解决方案2】:

      您可以根据FieldgetDeclaredClass()进行过滤:

      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;
      }
      

      这仅选择 yz 作为您的示例。

      【讨论】:

      • 三通。我在提供的代码示例上测试了getDeclaredFields(),发现它返回了三个元素,因此将其视为不正确而拒绝。 (是的,这比阅读文档更容易。)但是,我将示例代码粘贴为内部类,第三个字段不是 BaseClass.x,它是 SuperClass.this$0 引用。阅读?呸!
      【解决方案3】:

      可能有一种更简洁的方法可以使用某些函数的标志来执行此操作,但一个明显的答案(以及我过去所做的)是找出this.getClass().getFields()super.getClass().getFields() 数组之间的区别。

      【讨论】:

        【解决方案4】:

        使用公共Field[] getDeclaredFields()

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-08
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 2013-10-24
          相关资源
          最近更新 更多