Como posso determinar se uma classe Java é abstrata por reflexão


184

Estou interagindo através de classes em um arquivo Jar e desejo encontrar aquelas que não são abstratas. Eu posso resolver isso instanciando as classes e capturando InstantiationException, mas isso tem um impacto no desempenho, pois algumas classes têm inicialização pesada. Não consigo encontrar nada obviamente como isAbstract () nos documentos Class.java.

Respostas:


321

Ele terá o resumo como um de seus modificadores quando você chamar getModifiers () no objeto de classe.

Este link deve ajudar.

 Modifier.isAbstract( someClass.getModifiers() );

Além disso:

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
Obrigado! Uma pequena observação: você não pode usar "class" como um nome de variável, talvez queira alterar seu exemplo.
Tim Büthe

@seth eu acho que deveria ser Modifier.isAbstract( someClass.class.getModifiers() );talvez você quer mudar isso
steven7mwesigwa

De acordo com as convenções normais de nomeação Java ou é someClass.getModifiers()ou SomeClass.class.getModifiers()ondeClass<SomeClass> someClass = SomeClass.class;
neXus

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

1
Além disso, o que seth disse. :)
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 for uma interface e o nome da classe for java.util.List, você poderá criar o ArrayList
Abdushkur Ablimit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.