Comment puis-je déterminer si une classe Java est abstraite par réflexion

190

J'interagis à travers les classes dans un fichier Jar et je souhaite trouver celles qui ne sont pas abstraites. Je peux résoudre cela en instanciant les classes et en piégeant InstantiationException, mais cela a un impact négatif sur les performances car certaines classes ont un démarrage important. Je ne trouve évidemment rien comme isAbstract () dans la documentation Class.java.

peter.murray.rust
la source

Réponses:

328

Il aura abstract comme l'un de ses modificateurs lorsque vous appelez getModifiers () sur l'objet de classe.

Ce lien devrait vous aider.

 Modifier.isAbstract( someClass.getModifiers() );

Aussi:

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
la source
1
Merci! Une petite note: vous ne pouvez pas utiliser "class" comme nom de variable, peut-être voulez-vous changer votre exemple.
Tim Büthe
@seth Je pense que ça devrait être Modifier.isAbstract( someClass.class.getModifiers() );peut-être que vous voulez changer cela
steven7mwesigwa
Selon les conventions de nommage Java normales , il est soit someClass.getModifiers()ou SomeClass.class.getModifiers()Class<SomeClass> someClass = SomeClass.class;
neXus
32
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());
Stobor
la source
1
Aussi, ce que Seth a dit. :)
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
la source
s'il s'agit d'une interface et que le nom de la classe est java.util.List, vous pouvez créer ArrayList
Abdushkur Ablimit