是否可以在不创建实例的情况下检查一个 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,他们在那里讨论 isAssignableFrom
和 getSuperClass
,但是 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
我有两个 Class<? extends SomeClass>
变量,一个是通过循环 HashMap
的键获得的,我们称之为 A
,另一个作为参数传递,我们'我会打电话给 B
。我想看看 B
是否扩展 A
.
所以,根据我目前的理解,我会创建一个 B
的实例(使用 createInstance
)并检查 instanceof
。但这不仅非常慢,而且很麻烦,因为 classes 需要一个空的构造函数。
请参阅 here and here,他们在那里讨论 isAssignableFrom
和 getSuperClass
,但是 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