ก่อนอื่นมาทำความรู้จักกันสองสามหมวดหมู่
คลาส (java.lang.class)
วัตถุคลาสเป็นวัตถุพิเศษและแต่ละคลาสมีวัตถุคลาสเพื่อสร้างวัตถุ "ปกติ" ของคลาสนั้น สามารถรับได้ผ่านวิธี getClass () ของวัตถุ
ตัวอย่างเช่นเราเรียกใช้รหัสบรรทัดนี้:
การคัดลอกรหัสมีดังนี้:
System.out.println ("ทดสอบ" .getClass (). ToString ());
ผลที่ได้คือ:
การคัดลอกรหัสมีดังนี้:
คลาส java.lang.string
ฟิลด์ (java.lang.reflect.field)
คลาสนี้แสดงถึงฟิลด์ซึ่งสามารถใช้ในการเข้าถึงคลาส
ถัดไปเรามาสร้างคลาสทดสอบ:
การคัดลอกรหัสมีดังนี้:
หนังสือชั้นเรียน {
ชื่อสตริงสาธารณะ;
ความยาว int สาธารณะ = 0;
Public ArrayList <Page> หน้า = null;
@Override
สตริงสาธารณะ toString () {
สตริง sb = "หนังสือ:/n";
sb+= "title ="+title+"/n";
sb + = "ความยาว =" + ความยาว + "/n";
sb + = "pages =" + หน้า + "/n";
ถ้า (หน้า! = null) {
สำหรับ (หน้าหน้า: หน้า) {
sb += page.toString ();
-
-
ส่งคืน sb.toString ();
-
-
หน้าคลาส {
@Override
สตริงสาธารณะ toString () {
ส่งคืน "หน้า/n";
-
-
เรียกวิธีการต่อไปนี้เพื่อทดสอบคลาสข้างต้น:
การคัดลอกรหัสมีดังนี้:
หนังสือหนังสือ = หนังสือเล่มใหม่ ();
System.out.println (หนังสือ);
ผลลัพธ์คือสิ่งนี้:
การคัดลอกรหัสมีดังนี้:
หนังสือ:
title = null
ความยาว = 0
หน้า = null
นี่คือสถานะเริ่มต้นของวัตถุหนังสือ
เราใช้กลไกการสะท้อนเพื่อรับฟิลด์ความยาวในวัตถุหนังสือและแก้ไขเพื่อดูผลลัพธ์:
การคัดลอกรหัสมีดังนี้:
หนังสือหนังสือ = หนังสือเล่มใหม่ ();
คลาส <?> aclass = book.getClass ();
ฟิลด์ฟิลด์ = aclass.getfield ("ความยาว");
Field.setint (หนังสือ, 9);
System.out.println (หนังสือ);
คุณจะเห็นว่าผลการทำงานคือ:
การคัดลอกรหัสมีดังนี้:
หนังสือ:
title = null
ความยาว = 9
หน้า = null
จะเห็นได้ว่าค่าของฟิลด์ความยาวได้รับการแก้ไข
การแก้ไขข้างต้นเป็นฟิลด์ง่าย ๆ ของ INT
การคัดลอกรหัสมีดังนี้:
หนังสือหนังสือ = หนังสือเล่มใหม่ ();
คลาส <?> aclass = book.getClass ();
ฟิลด์ [] ฟิลด์ = aclass.getFields ();
สำหรับ (ฟิลด์ฟิลด์: ฟิลด์) {
field.setAccessible (จริง);
if (field.getType (). เท่ากับ (string.class)) {
Field.set (หนังสือ "Grimm's Fairy Tale");
} อื่นถ้า (field.getType (). เท่ากับ (int.class)) {
Field.set (หนังสือ, 199);
-
-
System.out.println (หนังสือ);
ผลลัพธ์ผลลัพธ์ของรหัสข้างต้นคือ:
การคัดลอกรหัสมีดังนี้:
หนังสือ:
title = เทพนิยายของกริมม์
ความยาว = 199
หน้า = null
ในความเป็นจริงฟิลด์ประเภทสตริงทั้งหมดได้รับการแก้ไขเป็น "เทพนิยายของกริมม์" และฟิลด์ประเภท int ทั้งหมดได้รับการแก้ไขเป็น 199 เราไม่รู้ด้วยซ้ำว่าสาขานี้หมายถึงอะไร
ต่อไปเราแก้ไขฟิลด์หน้า ฟิลด์นี้เป็น ArrayList
การคัดลอกรหัสมีดังนี้:
หนังสือหนังสือ = หนังสือเล่มใหม่ ();
คลาส <?> aclass = book.getClass ();
ฟิลด์ [] ฟิลด์ = aclass.getFields ();
สำหรับ (ฟิลด์ฟิลด์: ฟิลด์) {
field.setAccessible (จริง);
if (field.getType (). เท่ากับ (arraylist.class)) {
String genric = field.getGenericType (). toString ();
String genricclass = genric.substring (
Genric.indexof ('<') + 1
Genric.indexof ('>'));
คลาส <?> EntityClass = class.forName (GenricClass);
Object OBJ = EntityClass.NewInstance ();
arraylist list = new ArrayList ();
list.add (obj);
field.set (หนังสือ, รายการ);
-
-
System.out.println (หนังสือ);
ผลลัพธ์ผลลัพธ์มีดังนี้:
การคัดลอกรหัสมีดังนี้:
หนังสือ:
title = null
ความยาว = 0
หน้า = [หน้า
-
หน้าหนังสือ
จะเห็นได้ว่าแม้ว่าเราจะไม่ได้ใช้คลาสหน้าโดยตรง แต่เรายังคงสร้างวัตถุหน้า
คำสั่งการสร้างของวัตถุหน้าอยู่ในประโยค: entityclass.newinstance () คำสั่ง Newinstance เป็นวิธีการสำคัญของวัตถุคลาสและใช้เพื่อสร้างวัตถุที่เกี่ยวข้องของคลาสนี้ แน่นอนตัวสร้างคลาสรองรับ นอกจากนี้ด้วยวิธี GenGenericType เราสามารถรับตัวดัดแปลงประเภทของสนามได้ ใส่ไว้ที่นี่สิ่งที่คุณได้รับคือ ArrayList <Page> ด้วยสตริงนี้เราสามารถโหลดคลาสหน้าและสร้างวัตถุหน้าผ่านคลาส loader class.forName