Jak mogę ustalić, czy klasa Java jest abstrakcyjna poprzez odbicie


184

Przechodzę przez klasy w pliku jar i chcę znaleźć te, które nie są abstrakcyjne. Mogę rozwiązać ten problem, tworząc instancję klas i zatrzymując wyjątek InstantiationException, ale ma to negatywny wpływ na wydajność, ponieważ niektóre klasy mają ciężki start. Nie mogę znaleźć niczego takiego jak isAbstract () w dokumentach Class.java.

Odpowiedzi:


321

Będzie miał streszczenie jako jeden ze swoich modyfikatorów, gdy wywołasz metodę getModifiers () na obiekcie klasy.

Ten link powinien pomóc.

 Modifier.isAbstract( someClass.getModifiers() );

Również:

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
Dzięki! Jedna mała uwaga: nie możesz użyć „klasy” jako nazwy zmiennej, być może chcesz zmienić przykład.
Tim Büthe

@seth Myślę, że powinno być Modifier.isAbstract( someClass.class.getModifiers() );może chcesz to zmienić
steven7mwesigwa

Według normalnych konwencji nazewnictwa Java jest albo someClass.getModifiers()czy SomeClass.class.getModifiers()gdzieClass<SomeClass> someClass = SomeClass.class;
Nexus

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

1
Ponadto, co powiedział 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;
}

jeśli jest to interfejs, a nazwa klasy to java.util.List, możesz utworzyć ArrayList
Abdushkur Ablimit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.