Katakanlah saya punya kelas:
public class R {
public static final int _1st = 0x334455;
}
Bagaimana saya bisa mendapatkan nilai "_1st" melalui refleksi?
BR
kelas.
Katakanlah saya punya kelas:
public class R {
public static final int _1st = 0x334455;
}
Bagaimana saya bisa mendapatkan nilai "_1st" melalui refleksi?
BR
kelas.
Jawaban:
Pertama-tama ambil properti bidang kelas, lalu Anda dapat mengambil nilainya. Jika Anda mengetahui jenisnya, Anda dapat menggunakan salah satu metode get dengan null (hanya untuk kolom statis, sebenarnya dengan kolom statis argumen yang diteruskan ke metode get diabaikan seluruhnya). Jika tidak, Anda dapat menggunakan getType dan menulis sakelar yang sesuai seperti di bawah ini:
Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
System.out.println(f.getInt(null));
}else if(t == double.class){
System.out.println(f.getDouble(null));
}...
getInt()
mengabaikan argumen yang disampaikan? Menghabiskan waktu berjam-jam untuk mencoba membuat instance kelas lulus di sana.
R.class.getField("_1st").get(null);
Penanganan pengecualian dibiarkan sebagai latihan bagi pembaca.
Pada dasarnya Anda mendapatkan bidang seperti yang lain melalui refleksi, tetapi ketika Anda memanggil metode get, Anda mengirimkan null karena tidak ada contoh untuk ditindaklanjuti.
Ini berfungsi untuk semua bidang statis, terlepas dari finalnya. Jika kolomnya bukan untuk publik, Anda perlu memanggilnya setAccessible(true)
terlebih dahulu, dan tentu saja SecurityManager harus mengizinkan semua ini.
Saya mengikuti rute yang sama (melihat melalui kelas R yang dihasilkan) dan kemudian saya memiliki perasaan buruk ini mungkin fungsi di kelas Sumber Daya. Saya benar.
Ketemu ini: Resources :: getIdentifier
Pikir itu mungkin menghemat waktu orang. Meskipun mereka mengatakan itu berkecil hati di dokumen, itu tidak terlalu mengejutkan.
R._1st
tidak bisa bekerja? Jika Anda berbicara tentang pengembangan Android, saya pikirR
kelasnya selalu ada ...