¿Cómo puedo determinar si una clase Java es abstracta por reflexión?

184

Estoy interactuando a través de clases en un archivo Jar y deseo encontrar aquellas que no sean abstractas. Puedo resolver esto instanciando las clases y atrapando InstantiationException, pero eso tiene un impacto en el rendimiento ya que algunas clases tienen un inicio pesado. No puedo encontrar nada obviamente como isAbstract () en los documentos de Class.java.

peter.murray.rust
fuente

Respuestas:

321

Tendrá resumen como uno de sus modificadores cuando llame a getModifiers () en el objeto de clase.

Este enlace debería ayudar.

 Modifier.isAbstract( someClass.getModifiers() );

También:

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
fuente
1
¡Gracias! Una pequeña nota: no puede usar "clase" como nombre de variable, tal vez quiera cambiar su ejemplo.
Tim Büthe
@seth Creo que debería ser Modifier.isAbstract( someClass.class.getModifiers() );tal vez quieras cambiar eso
steven7mwesigwa
De acuerdo con las convenciones de nomenclatura normales de Java, es someClass.getModifiers()o SomeClass.class.getModifiers()dóndeClass<SomeClass> someClass = SomeClass.class;
neXus el
31
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());
Stobor
fuente
1
Además, lo que dijo 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;
}
Abdushkur Ablimit
fuente
si es una interfaz y el nombre de la clase es java.util.List, podría crear ArrayList
Abdushkur Ablimit