Saya mencoba menerima nilai bidang melalui refleksi. Masalahnya adalah saya tidak tahu tipe field dan harus memutuskannya sembari mendapatkan nilainya.
Kode ini dihasilkan dengan pengecualian ini:
Tidak dapat mengatur java.lang.String field com .... fieldName ke java.lang.String
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Class<?> targetType = field.getType();
Object objectValue = targetType.newInstance();
Object value = field.get(objectValue);
Saya mencoba melakukan cast, tetapi saya mendapatkan kesalahan kompilasi:
field.get((targetType)objectValue)
atau
targetType objectValue = targetType.newInstance();
Bagaimana saya bisa melakukan ini?
java
reflection
Ido Barash
sumber
sumber
field.get()
seharusnyaobject
, bukanobjectValue
.Jawaban:
Seperti dijawab sebelumnya, Anda harus menggunakan:
Cara lain, yang kadang-kadang lebih disukai, adalah memanggil pengambil dengan dinamis. contoh kode:
Perlu diketahui juga bahwa ketika kelas Anda mewarisi dari kelas lain, Anda perlu secara rekursif menentukan bidang. misalnya, untuk mengambil semua Fields dari kelas yang diberikan;
sumber
BaseValidationObject
?object
kelas tidak memiliki metodegetMethods()
. Adakah saran?Anda harus lulus objek untuk mendapatkan metode bidang , jadi
sumber
object.getClass()
akan mengembalikan Anda objek Kelas ini)object
dalam cuplikan tidak ditentukan sehingga pembaca tidak dapat memahami cara menggunakannya.object
berarti objek target kita / contoh kita bekerja dengan. Saya pikir pembaca sebenarnya baik-baik saja dengan apa yang adaobject
dalam jawaban ini.Saya menggunakan refleksi dalam implementasi toString () dari kelas preferensi saya untuk melihat anggota kelas dan nilai-nilai (debugging sederhana dan cepat).
Kode sederhana yang saya gunakan:
Saya berharap itu akan membantu seseorang, karena saya juga telah mencari.
sumber
Meskipun tidak terlalu jelas bagi saya apa yang ingin Anda capai, saya melihat kesalahan yang jelas dalam kode Anda:
Field.get()
mengharapkan objek yang berisi bidang sebagai argumen, bukan nilai (mungkin) dari bidang itu. Jadi kamu harus punyafield.get(object)
.Karena Anda tampaknya mencari nilai bidang, Anda dapat memperolehnya sebagai:
Tidak perlu instantiate jenis bidang dan membuat beberapa nilai kosong / default; atau mungkin ada sesuatu yang saya lewatkan.
sumber
object
tidak ditentukan, pembaca tidak dapat memahami bagaimana menerapkan jawabannya.sumber
Anda memanggil dapatkan dengan argumen yang salah.
Harus:
sumber
object
tidak didefinisikan, pembaca tidak dapat memahami bagaimana menerapkan contoh dalam jawabanSaya memposting solusi saya di Kotlin, tetapi dapat bekerja dengan objek java juga. Saya membuat ekstensi fungsi sehingga objek apa pun dapat menggunakan fungsi ini.
Lihatlah halaman web ini: https://www.geeksforgeeks.org/field-get-method-in-java-with-examples/
sumber
sumber