【问题标题】:Java - Exclude superclass fields from reflectionJava - 从反射中排除超类字段
【发布时间】:2012-11-19 23:30:49
【问题描述】:

我正在使用此代码来获取与对象关联的所有字段。有问题的 Object 具有三个超类,其他类从该对象扩展而来。

for (Field f : this.getClass().getFields()){
    try{
        fieldName = f.getName();
        fieldType = f.getType().toString();
        //Do more stuf
    }

我不想获取与超类关联的字段,但我想要当前类中的所有字段以及所有可能从它扩展的字段。

如何筛选出我需要的字段?

【问题讨论】:

    标签: java class reflection field superclass


    【解决方案1】:

    我不想获取与超类关联的字段,但我想要当前类中的所有字段以及所有可能从它扩展的字段。

    您无法获得“所有可能从它扩展的内容” - 但如果您使用 Class.getDeclaredFields() 而不是 getFields(),那么您将只能获得该类中声明的字段。

    【讨论】:

      【解决方案2】:

      对于每个Field,您可以使用getDeclaringClass() 来确定声明该字段的类,所以如果您有类似的层次结构

      A
      |
      B
      |
      C
      |\
      D E
      

      并且您只想要在CDE 中声明的字段,那么您可以说

      for (Field f : this.getClass().getFields()){
        if(C.class.isAssignableFrom(f.getDeclaringClass())) {
          // f was declared by C or one of its subclasses
      

      如果thisC 的实例,您将只获得C 的公共字段,如果thisD,您将获得C 和@987654334 的公共字段@,如果thisAB,则根本不会得到任何字段。

      【讨论】:

      • 比下面的答案更复杂
      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多