Bagaimana saya bisa menentukan apakah kelas Java abstrak oleh refleksi

184

Saya menengahi melalui kelas dalam file Jar dan berharap menemukan yang tidak abstrak. Saya dapat menyelesaikan ini dengan membuat instance kelas dan menjebak InstantiationException tapi itu memiliki kinerja yang baik karena beberapa kelas memiliki startup yang berat. Saya tidak dapat menemukan apa pun yang jelas seperti isAbstract () di dokumen Class.java.

peter.murray.rust
sumber

Jawaban:

321

Ini akan memiliki abstrak sebagai salah satu pengubah ketika Anda memanggil getModifiers () pada objek kelas.

Tautan ini seharusnya membantu.

 Modifier.isAbstract( someClass.getModifiers() );

Juga:

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
sumber
1
Terima kasih! Satu catatan kecil: Anda tidak dapat menggunakan "class" sebagai nama variabel, mungkin Anda ingin mengubah contoh Anda.
Tim Büthe
@seth Saya pikir itu Modifier.isAbstract( someClass.class.getModifiers() );mungkin Anda ingin mengubahnya
steven7mwesigwa
Menurut konvensi penamaan Java yang normal, ini adalah salah satu someClass.getModifiers()atau di SomeClass.class.getModifiers()manaClass<SomeClass> someClass = SomeClass.class;
neXus
31
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());
Stobor
sumber
1
Juga, apa yang dikatakan 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
sumber
jika itu adalah antarmuka dan nama kelas adalah java.util.List Anda mungkin akan membuat ArrayList
Abdushkur Ablimit