¿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.

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


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

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

si es una interfaz y el nombre de la clase es java.util.List, podría crear ArrayList
Abdushkur Ablimit
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.