How to find out if a field is instanceof a type via reflection?

JavaReflection

Java 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionc0d3xView Question on Stackoverflow
Solution 1 - JavafastcodejavaView Answer on Stackoverflow
Solution 2 - JavaskaffmanView Answer on Stackoverflow
Solution 3 - JavaSteven LizarazoView Answer on Stackoverflow
Solution 4 - JavaDanielJycView Answer on Stackoverflow