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.

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


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.