Come posso determinare se una classe Java è astratta per riflessione


184

Sto interagendo attraverso le classi in un file Jar e desidero trovare quelli che non sono astratti. Posso risolverlo istanziando le classi e intrappolando InstantiationException ma questo ha un impatto sulle prestazioni poiché alcune classi hanno un avvio pesante. Ovviamente non riesco a trovare nulla di simile a isAbstract () nei documenti Class.java.

Risposte:


321

Avrà abstract come uno dei suoi modificatori quando si chiama getModifiers () sull'oggetto classe.

Questo link dovrebbe aiutare.

 Modifier.isAbstract( someClass.getModifiers() );

Anche:

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
Grazie! Una piccola nota: non puoi usare "class" come nome di una variabile, forse vuoi cambiare il tuo esempio.
Tim Büthe

@seth Penso che dovresti Modifier.isAbstract( someClass.class.getModifiers() );forse volerlo cambiare
steven7mwesigwa,

Secondo le normali convenzioni di denominazione Java è someClass.getModifiers()o SomeClass.class.getModifiers()doveClass<SomeClass> someClass = SomeClass.class;
neXus il

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

1
Inoltre, cosa ha detto Seth. :)
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;
}

se si tratta di un'interfaccia e il nome della classe è java.util.List potresti creare ArrayList
Abdushkur Ablimit il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.