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

cra*_*esh 174 java reflection class

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

Sea*_*oyd 372

你想要这个方法:

boolean isList = List.class.isAssignableFrom(myClass);
Run Code Online (Sandbox Code Playgroud)

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

来自JavaDoc:

确定此Class对象表示的类或接口是否与指定Class参数表示的类或接口相同,或者是它们的超类或超接口.它返回,true如果是这样; 否则它会返回false.如果此Class对象表示基本类型,则此方法返回true指定Class参数是否恰好是此Class对象; 否则它会返回false.

参考:


有关:

a)检查Object是否是编译时知道的类或接口(包括子类)的实例:

boolean isInstance = someObject instanceof SomeTypeOrInterface;
Run Code Online (Sandbox Code Playgroud)

例:

assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);
Run Code Online (Sandbox Code Playgroud)

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

Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);
Run Code Online (Sandbox Code Playgroud)

例:

public boolean checkForType(Object candidate, Class<?> type){
    return type.isInstance(candidate);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意这个方案:`SUPERCLASS.isAssignableFrom(SUBCLASS)`这首先使我感到困惑,尽管考虑到命名它实际上是显而易见的. (16认同)
  • @TrudleR我同意.像`SUPERCLASS.isExtendedBy(SUBCLASS)`之类的东西会更容易理解 (7认同)

Lan*_*dei 23

另一种选择是instanceof:

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

  • 这意味着,你实现了"Field".但我只是想"看"我的班级及其领域,不想"试试看". (4认同)

Mar*_*rco 9

instanceof适用于实例,即对象.有时你想直接与班级一起工作.在这种情况下,您可以使用Class类的asSubClass方法.一些例子:

1)

    Class o=Object.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)

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

2)

    Class o=JButton.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)

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

3)

    Class o=Serializable.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)

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

当然,必须包括所需的进口.


To *_*Kra 5

这对我有用:

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;
}
Run Code Online (Sandbox Code Playgroud)