是否可以在不创建实例的情况下检查一个 class 是否在 java 中扩展另一个?

Is it possible to check if one class is extending another in java without making instances?

我有两个 Class<? extends SomeClass> 变量,一个是通过循环 HashMap 的键获得的,我们称之为 A,另一个作为参数传递,我们'我会打电话给 B。我想看看 B 是否扩展 A.

所以,根据我目前的理解,我会创建一个 B 的实例(使用 createInstance)并检查 instanceof。但这不仅非常慢,而且很麻烦,因为 classes 需要一个空的构造函数。 请参阅 here and here,他们在那里讨论 isAssignableFromgetSuperClass,但是 isAssignableFrom(根据我在那里阅读的内容)在相同的 class 上不起作用(SomeClass.isAssignableFrom(SomeClass) ?), getSuperClass 没有走上树。

有没有一种方法可以检查 B 是否扩展了 A 而无需创建 B 的实例?

例如:

class SomeClass {}
class ExtendingClassA extends SomeClass {}
class ExtendingClassAB extends ExtendingClassA {}
class ExtendingClassB extends SomeClass {}
boolean ClassExtendsClass(Class<? extends SomeClass> A,Class<? extends SomeClass> B) {
    return A.class instanceof B.class;
}
ClassExtendsClass(SomeClass.class, ExtendingClassA.class); //true
ClassExtendsClass(SomeClass.class, ExtendingClassAB.class); //true
ClassExtendsClass(SomeClass.class, ExtendingClassB.class); //true
ClassExtendsClass(ExtendingClassA.class, ExtendingClassB.class); //false

是的。通常,检查您认为适合它的类型的 API (javadoc)。在这种情况下,那就是 Class 本身,幸运的是,it's there:

Class<?> a = Integer.class;
Class<?> b = Number.class;
System.out.println(b.isAssignableFrom(a));
System.out.println(b.isAssignableFrom(b));
> true
> true

but isAssignableFrom (from what I read there) doesn't work on the same class

你应该在做出假设之前测试那些东西。它工作正常。

您可以递归地对 class 对象使用 getSuperclass 方法,直到您没有更多的 superclasses:

class A {}
class B extends A {}
class C extends B {}

public class Main {
    public static void main(String[] args) {
        Class clazz = C.class;

        System.out.println(clazz.getClass());
        System.out.println(clazz.getSuperclass());
        System.out.println(clazz.getSuperclass().getSuperclass());
        System.out.println(clazz.getSuperclass().getSuperclass().getSuperclass());
        System.out.println(clazz.getSuperclass().getSuperclass().getSuperclass().getSuperclass());
    }
}

上面的例子会产生

class java.lang.Class
class B
class A
class java.lang.Object
null