Wie kann ich durch Reflexion feststellen, ob eine Java-Klasse abstrakt ist?

183

Ich interagiere durch Klassen in einer Jar-Datei und möchte diejenigen finden, die nicht abstrakt sind. Ich kann dies lösen, indem ich die Klassen instanziiere und InstantiationException abfange, aber das hat einen Leistungseinbruch, da einige Klassen einen starken Start haben. Ich kann in den Class.java-Dokumenten offensichtlich nichts wie isAbstract () finden.

peter.murray.rust
quelle

Antworten:

320

Es hat abstrakt als einen seiner Modifikatoren, wenn Sie getModifiers () für das Klassenobjekt aufrufen.

Dieser Link sollte helfen.

 Modifier.isAbstract( someClass.getModifiers() );

Ebenfalls:

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

Seth
quelle
1
Vielen Dank! Ein kleiner Hinweis: Sie können "Klasse" nicht als Variablennamen verwenden, vielleicht möchten Sie Ihr Beispiel ändern.
Tim Büthe
@ Seth Ich denke, es sollte sein, Modifier.isAbstract( someClass.class.getModifiers() );vielleicht möchten Sie das ändern
steven7mwesigwa
Gemäß den normalen Java-Namenskonventionen ist es entweder someClass.getModifiers()oder SomeClass.class.getModifiers()woClass<SomeClass> someClass = SomeClass.class;
neXus
31
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());
Stobor
quelle
1
Auch was Seth gesagt hat. :)
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;
}
Abdushkur Ablimit
quelle
Wenn es sich um eine Schnittstelle handelt und der Klassenname java.util.List lautet, können Sie ArrayList
Abdushkur Ablimit