บทความนี้อธิบายถึงการใช้กลไกการสะท้อนการเขียนโปรแกรม Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
คำนำ: การสะท้อนกลับ: รับคลาส (ไฟล์ bytecode เช่น person.class ในบทความนี้) และเรียกใช้สมาชิก การสะท้อนอาจพบได้น้อยกว่าเล็กน้อยในการพัฒนาเลเยอร์แอปพลิเคชัน Android แต่สำหรับผู้ที่ต้องการผ่านชั้นพื้นฐานพวกเขาจะต้องมีความเชี่ยวชาญในการใช้งาน
ชั้นเรียน
person.java
แพ็คเกจ com.sunwenou.reflect; // ชื่อแพ็คเกจระดับบุคคลระดับบุคคล {ชื่อสตริงส่วนตัว; อายุ int ส่วนตัว; บุคคลสาธารณะ () {// ไม่มีพารามิเตอร์} บุคคลสาธารณะ (ชื่อสตริงอายุ int) {// ด้วยพารามิเตอร์ super (); this.name = ชื่อ; this.age = อายุ; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } public int getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุ int) {this.age = อายุ; } @Override Public String ToString () {return name+","+Age; } โมฆะสาธารณะ show () {// พารามิเตอร์ที่ว่างเปล่า System.out.println ("แสดง"); } โมฆะสาธารณะสนุก (สตริง SS) {// ด้วยพารามิเตอร์ System.out.println (SS); } ฟังก์ชั่นโมฆะสาธารณะคงที่ () {// system.out.out.println ("คงที่"); -วิธีการรับไฟล์ bytecode แบบไดนามิกแบบไดนามิก
เพื่อให้โพสต์บล็อกดูกระชับข้อยกเว้นจะถูกโยนออกไปและนำเข้าถูกละเว้นด้านล่างเดียวกัน
แพ็คเกจ com.sunwenou.reflect; คลาสสาธารณะ DEMO1 { /*** วิธีการที่ได้รับไฟล์ bytecode แบบไดนามิก* 1: ใช้วิธี getClass () คลาสที่จัดทำโดยคลาสวัตถุ* วิธีนี้ต้องการวัตถุ* 2: แต่ละประเภทข้อมูล* จำเป็นต้องใช้สตริงซึ่งประกอบด้วยชื่อแพ็คเกจ + ชื่อคลาส*/โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// getClaz (); // getCalz2 (); getclaz3 (); } // ใช้วิธีการ forname () ที่จัดทำโดยคลาสโมฆะสาธารณะคงที่ getClaz3 () พ่นข้อยกเว้น {คลาส <?> claz = class.forname ("com.sunwenou.reflect.person"); คลาส <?> claz2 = class.forname ("com.sunwenou.reflect.person"); System.out.println (Claz == Claz2); } // แต่ละประเภทข้อมูลมีแอตทริบิวต์คลาสคงที่โมฆะสาธารณะคงที่ getCalz2 () {คลาส <person> p1 = person.class; คลาส <person> p2 = person.class; System.out.println (P1 == P2); } // ใช้เมธอด GetClass () คลาสที่จัดทำโดย Object Class Public Static Void GetClaz () {person person1 = บุคคลใหม่ (); ชั้นเรียน <? ขยายบุคคล> claz = person1.getClass (); // person.class person 2 = บุคคลใหม่ (); ชั้นเรียน <? ขยายบุคคล> claz2 = person2.getclass (); // person.class system.out.println (claz == claz2); -รับคลาสแบบไดนามิกและสร้างวัตถุ
แพ็คเกจ com.sunwenou.reflect; คลาสสาธารณะ Demo2 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// createobj (); createObj2 (); } โมฆะคงที่สาธารณะ createObj2 () โยนข้อยกเว้น {// บุคคลบุคคล = บุคคลใหม่ ("lisi", 23); // รับคลาสวัตถุไฟล์ bytecode <?> claz = class.forName ("com.sunwenou.reflect.person"); //person.class // รับวัตถุประเภทตัวสร้างที่วิธีการสร้างที่มีพารามิเตอร์เป็นของ Constructor Constructor = claz.getConstructor (string.class, int.class); // สร้างวัตถุโดยใช้วิธีการสร้างวัตถุที่จัดทำโดยบุคคลในคลาสคอนสตรัคเตอร์ = (บุคคล) constructor.newinstance ("lisi", 23); System.out.println (บุคคล); } โมฆะคงที่สาธารณะ createObj () โยนข้อยกเว้น {// บุคคลบุคคล = บุคคลใหม่ (); // รับคลาสวัตถุไฟล์ bytecode <?> claz = class.forName ("com.sunwenou.reflect.person"); Object OBJ = Claz.NewInstance (); // โดยค่าเริ่มต้นใช้ตัวสร้างพารามิเตอร์ว่างเพื่อสร้าง Object System.out.println (OBJ); -รับคลาสและกำหนดค่าให้กับตัวแปรสมาชิกแบบไดนามิก
แพ็คเกจ com.sunwenou.reflect; คลาสสาธารณะ demo3 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// บุคคล p = บุคคลใหม่ (); //p.name = "lisi"; // รับคลาสวัตถุไฟล์ bytecode <?> claz = class.forName ("com.sunwenou.reflect.person"); // รับวัตถุประเภทฟิลด์ที่ตัวแปรสมาชิกเป็นของ // ฟิลด์ฟิลด์ = claz.getfield ("ชื่อ"); // รับสมาชิกที่มีฟิลด์การอนุญาตสาธารณะ = claz.getDeclaredField ("ชื่อ"); // รับฟิลด์ที่ประกาศทั้งหมด System.out.println (ฟิลด์); // ตัวแปรสมาชิกที่ไม่คงที่ขึ้นอยู่กับวัตถุขึ้นอยู่กับวัตถุ obj = claz.newinstance (); field.setAccessible (true); // brute force cracking ตั้งค่าเป็น field.set ที่เข้าถึงได้ (OBJ, "Zhang San"); System.out.println (OBJ); -รับคลาสแบบไดนามิกและดำเนินการวิธีการ
แพ็คเกจ com.sunwenou.reflect; Demo4 ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// method1 (); Method2 (); วิธีการ 3 (); } โมฆะคงที่สาธารณะวิธีการ 3 () พ่นข้อยกเว้น {// รับคลาสไฟล์ไฟล์ bytecode <?> claz = class.forname ("com.sunwenou.reflect.person"); วิธี m = claz.getMethod ("ฟังก์ชั่น", null); m.invoke (null, null); } //// ดำเนินการเมธอดด้วยพารามิเตอร์โมฆะแบบคงที่สาธารณะเมธอด 2 () พ่นข้อยกเว้น {// รับคลาสวัตถุไฟล์ bytecode <?> claz = class.forname ("com.sunwenou.reflect.person"); Method M = Claz.getMethod ("fun", string.class); Object OBJ = Claz.NewInstance (); M.Invoke (OBJ, "Hello"); } // ดำเนินการวิธีการที่ไม่มีพารามิเตอร์โมฆะคงที่สาธารณะวิธีการ 1 () โยนข้อยกเว้น {// บุคคลบุคคล = บุคคลใหม่ (); person.show (); // รับคลาสวัตถุไฟล์ bytecode <?> claz = class.forName ("com.sunwenou.reflect.person"); // รับวัตถุไฟล์ bytecode ซึ่งเป็นวิธีการที่ดำเนินการ วิธี m = claz.getMethod ("แสดง", null); // วิธีที่ไม่คงที่ขึ้นอยู่กับวัตถุขึ้นอยู่กับวัตถุ obj = claz.newinstance (); // ดำเนินการวิธีการ m.invoke (obj, null); -นี่คือการใช้งานพื้นฐานของการสะท้อน เราสามารถสร้างวัตถุผ่านไฟล์ bytecode ของวัตถุเมื่อเราไม่สามารถสร้างวัตถุได้ตามปกติและดำเนินการ คุณได้เรียนรู้วิธีการทำหรือไม่? -
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Java โปรดตรวจสอบหัวข้อของเว็บไซต์นี้: "บทนำและการสอนขั้นสูงเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ Java", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม", "สรุปการดำเนินงานของ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน