How to find out if a field is instanceof a type via reflection?
JavaReflectionJava Problem Overview
I want to find out via reflection if a field is an instance of some type T
.
Lets say I have an object o
. Now I want to know if it has any fields which are instance of T
. I can get all fields with:
o.getClass().getFields();
I can get the type of the field with:
field.getType();
But now I want to know if this type or any supertype equals T
. Do I have to call getSuperclass()
recursively to be sure to check all supertypes?
Java Solutions
Solution 1 - Java
You have to use isAssignableFrom.
Solution 2 - Java
The rather baroquely-named Class.isAssignableFrom
is what you're after. I usually end up having to read the javadoc to make sure I get it the right way around:
> Determines if the class or interface > represented by this Class object is > either the same as, or is a superclass > or superinterface of, the class or > interface represented by the specified > Class parameter. It returns true if > so; otherwise it returns false. If > this Class object represents a > primitive type, this method returns > true if the specified Class parameter > is exactly this Class object; > otherwise it returns false. > > Specifically, this method tests > whether the type represented by the > specified Class parameter can be > converted to the type represented by > this Class object via an identity > conversion or via a widening reference > conversion.
For example:
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());
}
}
}
}
Solution 3 - Java
If you want to compare the field type of a custom class you should try this, use .class because only primitive types has .TYPE.
if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}
Solution 4 - Java
In case of NullPointerException
, you can use org.springframework.util.TypeUtils#isAssignable(java.lang.reflect.Type, java.lang.reflect.Type) instead of java.lang.Class#isAssignableFrom