Saya punya objek Java 'ChildObj' yang diperpanjang dari 'ParentObj'. Sekarang, apakah mungkin untuk mengambil semua nama atribut dan nilai-nilai ChildObj, termasuk atribut yang diwarisi juga, menggunakan mekanisme refleksi Java?
Class.getFields memberi saya array atribut publik, dan Class.getDeclaredFields memberi saya array dari semua bidang, tetapi tidak ada yang menyertakan daftar bidang yang diwarisi.
Apakah ada cara untuk mengambil atribut yang diwarisi juga?
java
reflection
introspection
Veera
sumber
sumber
sumber
Jika Anda ingin mengandalkan perpustakaan untuk melakukannya, Apache Commons Lang versi 3.2+ menyediakan
FieldUtils.getAllFieldsList
:sumber
Anda perlu menelepon:
Mengulang hierarki warisan seperlunya.
sumber
Gunakan perpustakaan Refleksi:
sumber
Solusi rekursif OK, satu-satunya masalah kecil adalah bahwa mereka mengembalikan superset anggota yang dinyatakan dan diwarisi. Perhatikan bahwa metode getDeclaredFields () mengembalikan juga metode pribadi. Jadi mengingat bahwa Anda menavigasi seluruh hierarki superclass, Anda akan menyertakan semua bidang pribadi yang dideklarasikan dalam superclasses, dan itu tidak diwariskan.
Filter sederhana dengan Modifier.isPublic || Predikat Modifier.isProtected akan melakukan:
sumber
Versi yang berfungsi dari solusi "DidYouMeanThatTomHa ..." di atas
sumber
Dengan pustaka util spring, Anda dapat menggunakan untuk memeriksa apakah satu atribut spesifik ada di kelas:
Api doc:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
atau
Api doc:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@Bersulang
sumber
Anda dapat mencoba:
sumber
Lebih pendek dan lebih sedikit objek yang dipakai? ^^
sumber
getFields (): Mendapat semua bidang publik naik seluruh hierarki kelas dan
getDeclaredFields (): Mendapat semua bidang, terlepas dari pengubahnya tetapi hanya untuk kelas saat ini. Jadi, Anda harus mendapatkan semua hierarki yang terlibat.
Baru-baru ini saya melihat kode ini dari org.apache.commons.lang3.reflect.FieldUtils
sumber
sumber
Ini adalah penulisan ulang jawaban yang diterima oleh @ user1079877. Mungkin versi yang tidak mengubah parameter fungsi dan juga menggunakan beberapa fitur Java modern.
Implementasi ini juga membuat doa lebih ringkas:
sumber
Ada beberapa kebiasaan yang tidak ditangani oleh FieldUtils - khususnya bidang sintetik (misalnya disuntikkan oleh JaCoCo) dan juga fakta bahwa jenis enum tentu saja memiliki bidang untuk setiap contoh, dan jika Anda menelusuri grafik objek, mendapatkan semua bidang dan kemudian mendapatkan bidang masing-masing dll, maka Anda akan masuk ke loop tak terbatas ketika Anda menekan enum. Solusi yang diperluas (dan sejujurnya saya yakin ini harus tinggal di perpustakaan di suatu tempat!) Adalah:
Kelas uji di Spock (dan Groovy menambahkan bidang sintetis):
sumber