Saya bermain-main dengan API refleksi Java dan mencoba menangani beberapa bidang. Sekarang saya terjebak dengan mengidentifikasi jenis bidang saya. String itu mudah, lakukan saja myField.getType().equals(String.class)
. Hal yang sama berlaku untuk kelas non-turunan lainnya. Tetapi bagaimana saya memeriksa kelas turunan? Misalnya LinkedList
sebagai subkelas dari List
. Saya tidak dapat menemukan isSubclassOf(...)
atau extends(...)
metode. Apakah saya harus berjalan melalui semua getSuperClass()
dan menemukan supeclass sendiri?
java
class
reflection
craesh
sumber
sumber
LinkedList
bukan subkelas dariList
. Ini merupakan implementasi dariList
.Jawaban:
Anda menginginkan metode ini:
di mana secara umum,
List
(di atas) harus digantisuperclass
danmyClass
harus diganti dengansubclass
Dari JavaDoc :
Referensi:
Class.isAssignableFrom(Class)
Terkait:
a) Periksa apakah Obyek adalah turunan dari Kelas atau Antarmuka (termasuk subclass) yang Anda tahu pada waktu kompilasi:
Contoh:
b) Periksa apakah Obyek adalah turunan dari Kelas atau Antarmuka (termasuk subclass) yang hanya Anda ketahui saat runtime:
Contoh:
sumber
SUPERCLASS.isAssignableFrom(SUBCLASS)
Ini membingungkan saya dulu, meskipun sebenarnya jelas mempertimbangkan penamaannya.SUPERCLASS.isExtendedBy(SUBCLASS)
akan lebih mudah dipahamiisExtendedBy
adalah nama yang buruk danCLASS.isAssignableFrom(CLASS)
benar (dan karenanyaCLASS.isExtendedBy(CLASS)
juga). Ini tidak akan seperti yang saya harapkan.Pilihan lain adalah instanceof:
sumber
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/…Field
. Tapi saya hanya ingin "melihat" kelas saya dan bidangnya, tidak ingin "mencobanya".instanceof
juga berfungsi untuk orang tua (dalam hal iniNumber
) itu sendiri tidak hanya anakinstanceof bekerja pada instance, yaitu pada Objects. Terkadang Anda ingin bekerja secara langsung dengan kelas. Dalam hal ini Anda dapat menggunakan metode asSubClass dari kelas Class. Beberapa contoh:
1)
ini akan berjalan dengan lancar karena JFrame adalah subclass dari Object. c akan berisi objek Class yang mewakili kelas JFrame.
2)
ini akan meluncurkan java.lang.ClassCastException karena JFrame BUKAN subclass dari JButton. c tidak akan diinisialisasi.
3)
ini akan berjalan dengan lancar karena JFrame mengimplementasikan antarmuka java.io.Serializable. c akan berisi objek Class yang mewakili kelas JFrame.
Tentu saja impor yang dibutuhkan harus dimasukkan.
sumber
Ini bekerja untuk saya:
sumber
Ini adalah versi perbaikan dari jawaban @ schuttek. Ini ditingkatkan karena dengan benar mengembalikan false untuk primitif (mis. IsSubclassOf (int.class, Object.class) => false) dan juga menangani antarmuka dengan benar (mis. IsSubclassOf (HashMap.class, Map.class) => true).
sumber
Metode rekursif untuk memeriksa apakah a
Class<?>
adalah sub kelas dariClass<?>
...Versi perbaikan dari @To Kra 's jawabannya :
sumber
//Warisan
// Metode
// Uji kodenya
//Hasil
sumber