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

2022-08-31 15:07:36

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

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

o.getClass().getFields();

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

field.getType();

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


答案 1

您必须使用 isAssignableFrom


答案 2

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

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

具体而言,此方法测试指定的 Class 参数所表示的类型是否可以通过标识转换或通过加宽引用转换转换为此 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());
         }
      }
   }
}