如何通过反射找出一个字段是否是一个类型的实例?

c0d*_*d3x 53 java reflection

如果字段是某种类型的实例,我想通过反射找出T.

让我们说我有一个对象o.现在我想知道它是否有任何实例的字段T.我可以得到所有领域:

o.getClass().getFields();
Run Code Online (Sandbox Code Playgroud)

我可以得到该字段的类型:

field.getType();
Run Code Online (Sandbox Code Playgroud)

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

fas*_*ava 61

你必须使用isAssignableFrom.

  • 另请参阅同一文档中的isInstance. (6认同)

ska*_*man 46

相当巴洛克风格的名字Class.isAssignableFrom就是你所追求的.我通常最终必须阅读javadoc,以确保我正确地得到它:

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口.如果是这样,它返回true; 否则返回false.如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true.否则返回false.

具体来说,此方法测试是否可以通过标识转换或扩展引用转换将指定的Class参数表示的类型转换为此Class对象表示的类型.

例如:

public class X {

   public int i;

   public static void main(String[] args) throws Exception {
      Class<?> myType = Integer.TYPE;
      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());
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • Integer.TYPE;应该是Integer.class; (2认同)

Ste*_*azo 14

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

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