Java 如何通过反射确定字段是否为类型的实例?

Java 如何通过反射确定字段是否为类型的实例?,java,reflection,Java,Reflection,我想通过反射找出字段是否是某种类型的实例T 假设我有一个对象o。现在我想知道它是否有任何字段是T的实例。我可以使用以下工具获取所有字段: o.getClass().getFields(); 我可以通过以下方式获取字段的类型: field.getType(); 但现在我想知道这个类型或任何超类型是否等于T。我必须递归调用getSuperclass()以确保检查所有超类型吗?您必须使用。名称相当夸张的类。isAssignableFrom就是您要找的。我通常不得不阅读javadoc,以确保正确理解

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

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

o.getClass().getFields();
我可以通过以下方式获取字段的类型:

field.getType();

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

您必须使用。

名称相当夸张的
类。isAssignableFrom
就是您要找的。我通常不得不阅读javadoc,以确保正确理解:

确定类或接口 由该类对象表示的是 要么与超类相同,要么是超类 或上级,阶级或 由指定的 类参数。如果 所以否则返回false。如果 该类对象表示一个 基元类型,此方法返回 如果指定的类参数 就是这个类对象; 否则返回false

具体地说,这种方法测试 由 指定的类参数可以是 已转换为表示为的类型 该类通过一个标识创建对象 转换或通过加宽参照 转换

例如:

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());
         }
      }
   }
}
公共类X{
公共国际一级;
公共静态void main(字符串[]args)引发异常{
类myType=Integer.Class;
对象o=新的X();
for(字段:o.getClass().getFields()){
if(field.getType().isAssignableFrom(myType)){
System.out.println(“字段”+Field+”可从类型“+o.getClass())赋值);
}
}
}
}

如果要比较自定义类的字段类型,请尝试以下操作:, 使用.class,因为只有基元类型具有.TYPE


如果(field.getType().isAssignableFrom(**YOURCLASS.class**)){}
NullPointerException
的情况下,您可以使用而不是也可以在同一文档中查看isInstance应该是
Integer.class