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.

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


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

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

Wenn es sich um eine Schnittstelle handelt und der Klassenname java.util.List lautet, können Sie ArrayList
Abdushkur Ablimit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.