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 nichts offensichtliches wie isAbstract() finden.
Wie kann ich durch Reflektion feststellen, ob eine Java-Klasse abstrakt ist?
peter.murray.rust
seth
Es hat abstract als einen seiner Modifikatoren, wenn Sie getModifiers() für das Klassenobjekt aufrufen.
Dies Verknüpfung 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()
-
Vielen Dank! Eine kleine Anmerkung: Sie können “Klasse” nicht als Variablennamen verwenden, vielleicht möchten Sie Ihr Beispiel ändern.
– Tim Büthe
24. November 2010 um 17:07 Uhr
-
@seth Ich denke, es sollte sein
Modifier.isAbstract( someClass.class.getModifiers() );
vielleicht möchtest du das ändern– steven7mwesigwa
5. Januar 2019 um 0:36 Uhr
-
Nach den üblichen Java-Namenskonventionen ist es beides
someClass.getModifiers()
oderSomeClass.class.getModifiers()
woClass<SomeClass> someClass = SomeClass.class;
– neXus
23. Januar 2019 um 14:48 Uhr
Stobor
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());
Abduschkur Ablimit
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 ist, können Sie auch eine ArrayList erstellen
– Abduschkur Ablimit
21. Dezember 2017 um 19:47 Uhr