Как я могу определить, является ли класс Java абстрактным отражением


184

Я изучаю классы в файле Jar и хочу найти те, которые не являются абстрактными. Я могу решить эту проблему, создавая экземпляры классов и перехватывая InstantiationException, но это приводит к снижению производительности, так как некоторые классы сильно загружаются. Я не могу найти ничего такого, как isAbstract () в документации Class.java.

Ответы:


321

Он будет иметь абстрактный в качестве одного из своих модификаторов, когда вы вызовете getModifiers () для объекта класса.

Эта ссылка должна помочь.

 Modifier.isAbstract( someClass.getModifiers() );

Также:

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
Спасибо! Небольшое примечание: вы не можете использовать «класс» в качестве имени переменной, возможно, вы захотите изменить свой пример.
Тим Бюте

@ Seth Я думаю, что, может Modifier.isAbstract( someClass.class.getModifiers() );быть, вы хотите изменить это
steven7mwesigwa

В соответствии с обычными соглашениями об именах Java это либо someClass.getModifiers()или SomeClass.class.getModifiers()гдеClass<SomeClass> someClass = SomeClass.class;
NEXUS

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

1
Кроме того, что сказал Сет. :)
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;
}

если это интерфейс, а имя класса - java.util.List, вы можете создать ArrayList
Abdushkur Ablimit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.