Pertama, mari kita mengenal beberapa kategori.
Kelas (java.lang.class)
Objek kelas adalah objek khusus, dan setiap kelas memiliki objek kelas untuk membuat objek "reguler" dari kelas itu. Ini dapat diperoleh melalui metode getClass () dari objek.
Misalnya, kami menjalankan baris kode ini:
Salinan kode adalah sebagai berikut:
System.out.println ("test" .getClass (). ToString ());
Hasilnya adalah:
Salinan kode adalah sebagai berikut:
kelas java.lang.string
Field (java.lang.reflect.field)
Kelas ini mewakili bidang, yang dapat digunakan untuk mengakses kelas
Selanjutnya, mari kita buat kelas tes:
Salinan kode adalah sebagai berikut:
Buku kelas {
judul string publik;
Panjang int publik = 0;
Public ArrayList <Page> halaman = null;
@Mengesampingkan
Public String ToString () {
String SB = "Buku:/n";
sb+= "title ="+title+"/n";
sb + = "panjang =" + panjang + "/n";
sb + = "halaman =" + halaman + "/n";
if (halaman! = null) {
untuk (halaman halaman: halaman) {
sb += page.toString ();
}
}
return sb.tostring ();
}
}
halaman kelas {
@Mengesampingkan
Public String ToString () {
mengembalikan "halaman/n";
}
}
Hubungi metode berikut untuk menguji kelas di atas:
Salinan kode adalah sebagai berikut:
Buku buku = buku baru ();
System.out.println (buku);
Hasilnya adalah ini:
Salinan kode adalah sebagai berikut:
Buku:
judul = null
panjang = 0
Halaman = NULL
Ini adalah keadaan awal objek buku
Kami menggunakan mekanisme refleksi untuk mendapatkan bidang panjang dalam objek buku dan memodifikasinya untuk melihat hasilnya:
Salinan kode adalah sebagai berikut:
Buku buku = buku baru ();
Kelas <?> aclass = book.getClass ();
Bidang bidang = aclass.getfield ("panjang");
field.setint (buku, 9);
System.out.println (buku);
Anda dapat melihat bahwa hasil berjalan adalah:
Salinan kode adalah sebagai berikut:
Buku:
judul = null
panjang = 9
Halaman = NULL
Dapat dilihat bahwa nilai bidang panjang telah dimodifikasi.
Modifikasi di atas adalah bidang sederhana dari tipe int.
Salinan kode adalah sebagai berikut:
Buku buku = buku baru ();
Kelas <?> aclass = book.getClass ();
Bidang [] bidang = aclass.getFields ();
untuk (bidang bidang: bidang) {
field.setAccessible (true);
if (field.getType (). equals (string.class)) {
field.set (buku, "dongeng Grimm");
} else if (field.getType (). Equals (int.class)) {
field.set (Book, 199);
}
}
System.out.println (buku);
Hasil output dari kode di atas adalah:
Salinan kode adalah sebagai berikut:
Buku:
Judul = dongeng Grimm
Panjang = 199
Halaman = NULL
Faktanya, semua bidang jenis string dimodifikasi menjadi "dongeng Grimm" dan semua bidang jenis int dimodifikasi menjadi 199. Kami bahkan tidak tahu apa arti bidang ini.
Selanjutnya, kami memodifikasi bidang halaman. Bidang ini adalah daftar array.
Salinan kode adalah sebagai berikut:
Buku buku = buku baru ();
Kelas <?> aclass = book.getClass ();
Bidang [] bidang = aclass.getFields ();
untuk (bidang bidang: bidang) {
field.setAccessible (true);
if (field.getType (). Equals (arrayList.class)) {
String genric = field.getGenerictype (). ToString ();
String genricclass = genric.substring (
genric.indexof ('<') + 1,
genric.indexof ('>'));
Kelas <?> EntityClass = class.forname (genricclass);
Objek obj = entityclass.newinstance ();
Daftar ArrayList = ArrayList baru ();
list.add (obj);
field.set (buku, daftar);
}
}
System.out.println (buku);
Hasil output adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Buku:
judul = null
panjang = 0
halaman = [halaman
]
Halaman
Dapat dilihat bahwa meskipun kami tidak menggunakan kelas halaman secara langsung, kami masih membuat objek halaman.
Pernyataan pembuatan objek halaman ada dalam kalimat: entityclass.newinstance (). Pernyataan NewInstance adalah metode penting dari objek kelas dan digunakan untuk membuat objek yang sesuai dari kelas ini. Tentu saja, konstruktor kelas mendukungnya. Selain itu, melalui metode GenGenerictype, kita bisa mendapatkan pengubah tipe lapangan. Letakkan di sini, yang Anda dapatkan adalah arraylist <page>. Dengan string ini, kami dapat memuat kelas halaman dan membuat objek halaman melalui kelas Loader Class.forname.