检查一个类是否是Java中另一个类的子类

我正在玩Java的reflectionAPI,并试图处理一些领域。 现在我被困在确定我的领域的types。 string很容易,只要做myField.getType().equals(String.class) 。 其他非派生类也是如此。 但是,我如何检查派生类? 例如LinkedList作为List子类。 我找不到任何isSubclassOf(...)extends(...)方法。 我是否需要遍历所有的getSuperClass()并自己find我的supeclass?

你想要这个方法:

 boolean isList = List.class.isAssignableFrom(myClass); 

一般来说, List (上面)应该被superclassreplace, myClass应该被replace为subclass

从JavaDoc :

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

参考:

  • Class.isAssignableFrom(Class)

有关:

a)检查一个对象是否是在编译时知道的类或接口(包括子类)的一个实例:

 boolean isInstance = someObject instanceof SomeTypeOrInterface; 

例:

 assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>); 

b)检查一个Object是否是你在运行时只知道的一个Class或Interface(包括子类)的一个实例:

 Class<?> typeOrInterface = // acquire class somehow boolean isInstance = typeOrInterface.isInstance(someObject); 

例:

 public boolean checkForType(Object candidate, Class<?> type){ return type.isInstance(candidate); } 

另一种select是instanceof:

 Object o =... if (o instanceof Number) { double d = ((Number)o).doubleValue(); //this cast is safe } 

instanceof在实例上工作,即在对象上工作。 有时候你想直接和class级一起工作。 在这种情况下,您可以使用Class类的asSubClass方法。 一些例子:

1)

  Class o=Object.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o); 

这将顺利通过,因为JFrame是Object的子类。 c将包含一个表示JFrame类的Class对象。

2)

  Class o=JButton.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o); 

这将启动java.lang.ClassCastException,因为JFrame不是JButton的子类。 c不会被初始化。

3)

  Class o=Serializable.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o); 

这将顺利通过,因为JFrame实现了java.io.Serializable接口。 c将包含一个表示JFrame类的Class对象。

当然,所需的import必须包括在内。

这适用于我:

 protected boolean isTypeOf(String myClass, Class<?> superClass) { boolean isSubclassOf = false; try { Class<?> clazz = Class.forName(myClass); if (!clazz.equals(superClass)) { clazz = clazz.getSuperclass(); isSubclassOf = isTypeOf(clazz.getName(), superClass); } else { isSubclassOf = true; } } catch(ClassNotFoundException e) { /* Ignore */ } return isSubclassOf; } 

一个recrursive方法来检查一个clazz是一个superClass的“孩子”…

@ To_Kra的回答改进版本:

 protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) { if (superClass.equals(Object.class)) { // Every class is an Object. return true; } if (clazz.equals(superClass)) { return true; } else { clazz = clazz.getSuperclass(); // every class is Object, but superClass is below Object if (clazz.equals(Object.class)) { // we've reached the top of the hierarchy, but superClass couldn't be found. return false; } // try the next level up the hierarchy. return isSubclassOf(clazz, superClass); } }