【问题标题】:How to find out if a field is instanceof a type via reflection?如何通过反射找出一个字段是否是一个类型的实例?
【发布时间】:2010-02-14 18:57:18
【问题描述】:

我想通过反射找出一个字段是否是某种类型的实例T

假设我有一个对象o。现在我想知道它是否有任何字段是T 的实例。我可以通过以下方式获取所有字段:

o.getClass().getFields();

我可以通过以下方式获取字段的类型:

field.getType();

但是现在我想知道这个类型或任何超类型是否等于T。我是否必须递归调用getSuperclass() 以确保检查所有超类型?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    你必须使用isAssignableFrom

    【讨论】:

    • 另请参阅 isInstance,在同一文档中。
    【解决方案2】:

    颇具巴洛克风格的Class.isAssignableFrom 是您所追求的。我通常最终不得不阅读 javadoc 以确保我得到正确的方法:

    确定类或接口 由这个 Class 对象表示的是 要么相同,要么是超类 或超接口,类或 由指定表示的接口 类参数。如果返回 true 所以;否则返回false。如果 这个 Class 对象代表一个 原始类型,此方法返回 如果指定了 Class 参数,则为 true 正是这个 Class 对象; 否则返回 false。

    具体来说,这个方法测试 是否代表的类型 指定的Class参数可以是 转换为表示的类型 这个类对象通过一个身份 转换或通过扩大参考 转换。

    例如:

    public class X {
        
       public int i;
    
       public static void main(String[] args) throws Exception {
          Class<?> myType = Integer.class;
          Object o = new X();
          
          for (Field field : o.getClass().getFields()) {
             if (field.getType().isAssignableFrom(myType)) {
                System.out.println("Field " + field + " is assignable from type " + o.getClass());
             }
          }
       }
    }
    

    【讨论】:

    • Integer.TYPE; 应该是Integer.class;
    【解决方案3】:

    如果你想比较自定义类的字段类型,你应该试试这个, 使用 .class 因为只有原始类型有 .TYPE。

    if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2023-04-06
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多