检查一个类是否是Java中另一个类的子类
我正在玩Java的reflectionAPI,并试图处理一些领域。 现在我被困在确定我的领域的types。 string很容易,只要做myField.getType().equals(String.class)
。 其他非派生类也是如此。 但是,我如何检查派生类? 例如LinkedList
作为List
子类。 我找不到任何isSubclassOf(...)
或extends(...)
方法。 我是否需要遍历所有的getSuperClass()
并自己find我的supeclass?
你想要这个方法:
boolean isList = List.class.isAssignableFrom(myClass);
一般来说, List
(上面)应该被superclass
replace, 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); } }