简体   繁体   English

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

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

I have two Class<? extends SomeClass>我有两个Class<? extends SomeClass> Class<? extends SomeClass> variables, one obtained from looping the keys of a HashMap , we'll call it A , and one passed as a parameter, which we'll call B . Class<? extends SomeClass>变量,一个通过循环HashMap的键获得,我们称之为A ,一个作为参数传递,我们称之为B I'd like to see if B extends A .我想看看B是否扩展A

So, as I currently understand things, I'd make an instance of B (using createInstance ) and check instanceof .因此,据我目前了解的情况,我将创建一个B实例(使用createInstance )并检查instanceof But this is not only pretty slow, but cumbersome as classes need an empty constructor.但这不仅很慢,而且很麻烦,因为类需要一个空的构造函数。 See here and here , where they discuss isAssignableFrom and getSuperClass , but isAssignableFrom (from what I read there) doesn't work on the same class (SomeClass.isAssignableFrom(SomeClass)?), and getSuperClass doesn't walk up the tree.请参阅此处此处,他们讨论isAssignableFromgetSuperClass ,但isAssignableFrom (从我在那里读到的内容)在同一个 class (SomeClass.isAssignableFrom(SomeClass)?)上不起作用,并且getSuperClass不会走上树。

Is there a way I can check if B extends A without creating an instance of B ?有没有办法在不创建B实例的情况下检查B是否扩展A

For example:例如:

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

Yup.是的。 Generally, check the API (javadoc) of the type you think would be the right place for it.通常,检查您认为合适的类型的 API (javadoc)。 In this case, that'd be Class itself, and, luckily, it's there :在这种情况下,就是Class本身,幸运的是, 它就在那里

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但是 isAssignableFrom (从我那里读到的)在同一个 class 上不起作用

You should test that stuff before making assumptions.在做出假设之前,您应该测试这些东西。 It works fine.它工作正常。

you could use the getSuperclass method for a class object recursively until you have no more superclasses:您可以递归地对 class object 使用 getSuperclass 方法,直到没有更多的超类:

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());
    }
}

the above example will produce上面的例子将产生

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM