问题

我正在玩Java的反射API并试图处理一些字段。现在我一直在确定我的领域类型。字符串很简单,只需要myField.getType().equals(String.class)。这同样适用于其他非派生类。但是我如何检查派生类?例如,585809979是List的子类。我找不到任何isSubclassOf(...)extends(...)方法。我是否需要完成所有getSuperClass()并自己找到我的supeclass?


#1 热门回答(311 赞)

你想要这个方法:

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

一般情况下,List(上图)应替换为superclassmyClass应替换为subclass

从7925252072:

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true。否则返回false。
参考:- Class.isAssignableFrom(Class)
相关:
a)检查Object是否是编译时知道的类或接口(包括子类)的实例:

boolean isInstance = someObject instanceof SomeTypeOrInterface;

例:

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

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

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

例:

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

#2 热门回答(22 赞)

另一种选择是instanceof:

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

#3 热门回答(8 赞)

实例上的instanceofworks,即在Objects上。有时你想直接与班级一起工作。在这种情况下,你可以使用Class类的asSubClass方法。一些例子:

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

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

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

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

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

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

当然必须包括所需的进口。


原文链接