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.

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


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

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

jika itu adalah antarmuka dan nama kelas adalah java.util.List Anda mungkin akan membuat ArrayList
Abdushkur Ablimit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.