如何通过reflection找出一个字段是否是一个types的实例?

我想通过reflection找出一个字段是否是Ttypes的一个实例。

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

 o.getClass().getFields(); 

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

 field.getType(); 

但是现在我想知道这个types或者超types是否等于T 我是否必须recursion调用getSuperclass()以确保检查所有超types?

你必须使用isAssignableFrom 。

相当巴洛克式的Class.isAssignableFrom就是你所追求的。 我通常最终不得不阅读javadoc,以确保我得到正确的方式:

确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是其所属类或接口的超类或超接口。 如果是的话,它返回true; 否则返回false。 如果此Class对象表示一个基本types,则此方法返回true,如果指定的Class参数恰好是此Class对象; 否则返回false。

具体而言,此方法testing指定Class参数表示的types是否可以通过标识转换或通过扩展参考转换转换为此Class对象表示的types。

例如:

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

如果要比较自定义类的字段types,则应该尝试使用.class,因为只有基本types具有.TYPE。

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