บทความนี้วิเคราะห์กลไกการสะท้อนชวาในตัวอย่าง แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
การไตร่ตรองฉันมักจะได้ยินพวกเขาบอกว่าฉันได้อ่านวัสดุบางอย่างและอาจใช้พวกเขาในรูปแบบการออกแบบ แต่ฉันรู้สึกว่าฉันไม่เข้าใจมันมากขึ้น
1. มาดูแนวคิดของการไตร่ตรอง:
ส่วนใหญ่หมายถึงความสามารถที่โปรแกรมสามารถเข้าถึงตรวจจับและแก้ไขสถานะหรือพฤติกรรมของตนเองและสามารถปรับหรือปรับเปลี่ยนสถานะและความหมายที่เกี่ยวข้องของแอปพลิเคชันที่อธิบายพฤติกรรมตามสถานะและผลลัพธ์ของพฤติกรรมของตัวเอง
Reflection เป็นเครื่องมือที่ทรงพลังใน Java ที่ช่วยให้เราสามารถสร้างรหัสที่ยืดหยุ่นได้อย่างง่ายดายซึ่งสามารถประกอบได้เมื่อทำงานโดยไม่ต้องเชื่อมโยงซอร์สโค้ดระหว่างส่วนประกอบ แต่การใช้การสะท้อนที่ไม่เหมาะสมจะมีค่าใช้จ่ายสูงมาก!
มันเวียนหัวที่จะเห็นแนวคิดอ่านต่อไป
2. บทบาทของกลไกการสะท้อน:
1. decompile: .class->. java
2. เข้าถึงคุณสมบัติวิธีการสร้าง ฯลฯ ของวัตถุ Java ผ่านกลไกการสะท้อน
ดูเหมือนว่าจะเข้าใจได้ง่ายขึ้น
3. ก่อนอื่นให้ดูที่ชั้นเรียนที่ดวงอาทิตย์ให้กลไกการสะท้อนกลับของเรา:
java.lang.class; java.lang.reflect.constructor;
เราสามารถสอบถามวิธีการมากมายแอตทริบิวต์และการดำเนินการอื่น ๆ ในการไตร่ตรองจากชั้นเรียนทั้งสี่นี้ หรือคุณต้องเรียนรู้ที่จะสอบถาม API อย่างต่อเนื่อง?
4. ฟังก์ชั่นเฉพาะการใช้งาน:
1. มีสามวิธีในการรับคลาสโดยกลไกการสะท้อนกลับ
// วิธีแรก: classc1 = class.forname ("พนักงาน"); วัตถุในภาษา Java มีพนักงานวิธีการ getClass = พนักงานใหม่ ();2. สร้างวัตถุ: หลังจากได้รับคลาสแล้วเราจะสร้างวัตถุและใช้ Newinstance:
คลาส C = class.forName ("พนักงาน"); // สร้างอินสแตนซ์ใหม่ของคลาสที่แสดงโดย Object Object ของคลาสนี้ = C.NewInstance ();3. รับแอตทริบิวต์: แบ่งออกเป็นแอตทริบิวต์ทั้งหมดและแอตทริบิวต์ที่ระบุ:
①. ก่อนดูวิธีการเขียนของการรับคุณลักษณะทั้งหมด:
// รับคลาสทั้งหมดคลาส c = class.forname ("java.lang.integer"); // รับแอตทริบิวต์ทั้งหมด? แอตทริบิวต์สตริงบัฟเฟอร์ sb = new StringBuffer (); // แบ่งแต่ละแอตทริบิวต์ออกเป็นสตริงนี้โดยการผนวกวิธี // คำจำกัดความสาธารณะนอกสุด sb.append (modifier.toString (c.getModifiers ()) + "คลาส" + c.getSimplename ( ) +"{/n"); // แต่ละคุณสมบัติภายในสำหรับ (ฟิลด์ฟิลด์: fs) {sb.append ("/t"); // space sb.append (modifier .toString (field.getModifiers ()) + ""); // รับตัวดัดแปลงของแอตทริบิวต์เช่นสาธารณะ, คงที่ ฯลฯ sb.append (field.getType (). getSimplename () + ""); // รับชื่อประเภทของแอตทริบิวต์ sb.append ( field.getName () + ";/n"); // ชื่อคุณสมบัติ + Enter} sb.append ("}"); system.out.println (sb);②
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {<span style = "space สีขาว: pre"> </span> // วิธีก่อนหน้า:/* ผู้ใช้ u = ผู้ใช้ใหม่ (); // set system.out.println (U.AGE); ); // กำหนดค่า "110" ให้กับแอตทริบิวต์ id ของ Object IDF.Set (O, "110");4. รับวิธีการและวิธีการก่อสร้างไม่ได้อธิบายรายละเอียดอีกต่อไปเพียงดูคำหลัก:
คำหลักวิธี
ความหมาย
getDeclaredMethods ()
รับทุกวิธี
getReturntype ()
รับวิธีการส่งคืนวิธีการ
getParametertypes ()
รับชนิดพารามิเตอร์ที่เข้ามาของวิธีการ
getDeclaredMethod ("ชื่อวิธี", parameter type.class, ... )
รับวิธีการเฉพาะ
คำหลักของตัวสร้าง
ความหมาย
getDeclaredConstructors ()
รับตัวสร้างทั้งหมด
getDeclaredConstructor (parameter type.class, ... )
รับตัวสร้างเฉพาะ
คลาสแม่และอินเทอร์เฟซหลัก
ความหมาย
getSuperclass ()
รับคลาสหลักของคลาสที่แน่นอน
getInterfaces ()
รับอินเทอร์เฟซสำหรับการใช้งานบางประเภท
ด้วยวิธีนี้เราสามารถรับเนื้อหาต่าง ๆ ของชั้นเรียนและสลายตัวได้ สำหรับภาษาเช่น Java ที่รวบรวมก่อนแล้วจึงทำงานกลไกการสะท้อนกลับสามารถทำให้รหัสมีความยืดหยุ่นและง่ายขึ้นในการใช้งานเชิงวัตถุ
5. ไฟล์การสะท้อนกลับและไฟล์กำหนดค่าทำให้โปรแกรมของเรามีความยืดหยุ่นมากขึ้น:
ในการศึกษารูปแบบการออกแบบเมื่อเรียนรู้โรงงานนามธรรมการไตร่ตรองจะใช้เพื่ออ่านสตริงลิงก์ฐานข้อมูลที่สะดวกยิ่งขึ้น ฯลฯ ดังนั้นฉันจึงไม่เข้าใจมันมากในเวลานั้นดังนั้นฉันจึงคัดลอกมันตามนั้น ดูการใช้ไฟล์ Reflection + การกำหนดค่าใน. NET:
ไฟล์การกำหนดค่าที่ใช้ในเวลานั้นคือไฟล์ app.config และเนื้อหาอยู่ในรูปแบบ XML และเนื้อหาของฐานข้อมูลที่เชื่อมโยงถูกกรอก:
<การกำหนดค่า> <AppSettings> <เพิ่ม key = "" value = ""/> </appsettings> </การกำหนดค่า>
วิธีการเขียนสะท้อน:
Assembly.load ("ชื่อของแอสเซมบลีปัจจุบัน") createInstance ("ชื่อของเนมสเปซปัจจุบัน" ชื่อคลาสจะเป็นอินสแตนซ์);
ข้อได้เปรียบนี้เป็นเรื่องง่ายที่จะอำนวยความสะดวกให้เราเปลี่ยนฐานข้อมูล เพื่อเลือก
แน่นอนเช่นเดียวกันใน Java ยกเว้นว่าไฟล์การกำหนดค่าที่นี่คือ. properties เรียกว่าไฟล์คุณสมบัติ อ่านเนื้อหาในมันผ่านการสะท้อน วิธีนี้รหัสได้รับการแก้ไข แต่เราสามารถเปลี่ยนเนื้อหาของไฟล์การกำหนดค่าซึ่งทำให้รหัสของเรามีความยืดหยุ่นมากขึ้น!
โดยสรุปการเรียนรู้การสะท้อน Java อีกครั้งและการใช้มันอย่างยืดหยุ่นสามารถทำให้รหัสของเรามีความยืดหยุ่นมากขึ้น แต่ก็มีข้อเสียนั่นคือการใช้มันจะช่วยลดประสิทธิภาพของซอฟต์แวร์ของเราและเพิ่มความซับซ้อนดังนั้นเราจึงต้องใช้มัน อย่างระมัดระวัง.
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน