如何通过反射确定Java类是否抽象


183

我正在遍历Jar文件中的类,希望找到那些不是抽象的类。我可以通过实例化类并捕获InstantiationException来解决此问题,但是由于某些类的启动量很大,因此性能受到了影响。我在Class.java文档中找不到明显类似于isAbstract()的东西。

Answers:


320

当您在类对象上调用getModifiers()时,它将抽象作为其修改器之一。

链接应该有所帮助。

 Modifier.isAbstract( someClass.getModifiers() );

也:

http://java.sun.com/javase/6/docs/api/java/lang/reflect/Modifier.html

http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getModifiers()


1
谢谢!一点点注意:您不能使用“类”作为变量名,也许您想更改示例。
TimBüthe10年

@seth我认为可能应该是Modifier.isAbstract( someClass.class.getModifiers() );您要更改
steven7mwesigwa

根据正常的Java命名约定,它可以是- someClass.getModifiers()SomeClass.class.getModifiers()在哪里Class<SomeClass> someClass = SomeClass.class;
neXus

31
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());

1
还有,塞思说了什么。:)
Stobor

1
public static boolean isInstantiable(Class<?> clz) {
    if(clz.isPrimitive() || Modifier.isAbstract( clz.getModifiers()) ||clz.isInterface()  || clz.isArray() || String.class.getName().equals(clz.getName()) || Integer.class.getName().equals(clz.getName())){
        return false;
    }
    return true;
}

如果它是接口并且类名称为java.util.List,则可能会创建ArrayList
Abdushkur Ablimit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.