คำนำ:
เมื่อเร็ว ๆ นี้ บริษัท กำลังอยู่ระหว่างกระบวนการประกอบธุรกิจและการใช้งานการกำหนดเส้นทางใช้กลไกการสะท้อนของ Java เนื่องจากมีการใช้งานฉันต้องการศึกษาและสรุปอย่างระมัดระวัง ในความเป็นจริงไม่ว่าจะเป็นรุ่น EventBus 2.x ก่อนหน้า, การติดตั้งเพิ่มเติมหรือกรอบคำอธิบายประกอบมุมมองก่อนหน้านี้มันใช้กลไกการสะท้อนของ Java ในระดับที่มากขึ้นหรือน้อยลง
กลไกการสะท้อน Java คืออะไร?
กลไกการสะท้อนกลับของ Java คือในสถานะการทำงานสำหรับชั้นเรียนใด ๆ คุณสามารถรู้คุณสมบัติและวิธีการทั้งหมดของคลาสนี้ สำหรับวัตถุใด ๆ คุณสามารถเรียกวิธีการใด ๆ ที่ได้มาแบบไดนามิกและเรียกใช้วิธีการวัตถุแบบไดนามิกเรียกว่ากลไกการสะท้อน Java
กลไกการสะท้อนกลับมีฟังก์ชั่นอะไรบ้าง?
Java Mechnism Mechnism:
java.lang.class; // คลาส java.lang.reflect.constructor; // วิธีการสร้าง java.lang.reflect.field; // คลาสสมาชิกตัวแปร java.lang.reflect.method; // เมธอดคลาส java.lang.reflect.modifier; // การเข้าถึงสิทธิ์
การใช้กลไกการสะท้อน Java:
1. ) รับวัตถุในชั้นเรียน
// วิธีแรกคือการใช้ Object GetClass Method Person บุคคล = บุคคลใหม่ (); คลาส <?> class1 = person.getClass (); // วิธีที่สองคือการใช้แอตทริบิวต์คลาส Class1 = person.class; ลอง {// วิธีที่สามคือการใช้วิธีการแบบคงที่ของคลาส (classnotfoundexception e) {e.printstacktrace ();}2. ) รับข้อมูลสรุปของวัตถุคลาส
บูลีน isprimitive = class1.isprimitive (); // ตัดสินว่าเป็นประเภทพื้นฐานบูลีน isarray = class1.isarray (); // ตัดสินว่ามันเป็น boolean isannotation boolean = class1.isannotation หรือไม่ class1.isenum (); // ตัดสินว่ามันเป็นบูลีนคลาส enum isanonymousclass = class1.isanonymousclass (); // ตัดสินว่ามันเป็นบูลีนชั้นเรียนภายในระดับที่ไม่ระบุชื่อ ชื่อคลาสมีชื่อแพ็คเกจแพ็คเกจแพ็คเกจ Apackage = class1.getPackage (); // รับข้อมูลแพ็คเกจคลาสสตริง SimplEname = class1.getSimplename (); // รับคลาสคลาสคลาส modifiers = class1.getModifiers (); // รับคลาสการเข้าถึงคลาส class1.getDeclaringClass (); // คลาสภายนอก
3. ) รับแอตทริบิวต์วิธีการสร้าง ฯลฯ ของวัตถุคลาส
Field [] Allfields = class1.getDeclaredFields (); // รับคุณลักษณะทั้งหมดของฟิลด์วัตถุคลาส [] publicfields = class1.getFields (); // รับแอตทริบิวต์สาธารณะของวัตถุคลาสลอง {field agefield = class1.getDeclaredfield ("อายุ"); คลาส} catch (nosuchfieldexception e) {e.printStackTrace ();} วิธี [] วิธี = class1.getDeclaredMethods (); // รับวิธีการประกาศทั้งหมดของเมธอดคลาสคลาส [] allmethods = class1.getMethods () คลาสของคลาสคลาสคลาสคลาส <?> [] interfaceclasses = class1.getInterfaces (); // รับส่วนต่อประสานทั้งหมดของตัวสร้างวัตถุคลาส <?> [] allConstructors = class1.getDeclaredConstructors (); constructor <?> constructor = class1.getDeclaredConstructor (คลาสใหม่ [] {string.class}); // รับประกาศที่ระบุ constructor publicconstructor = class1.getConstructor (คลาสใหม่ [] {}); E.PrintStackTrace ();} คำอธิบายประกอบ [] คำอธิบายประกอบ = class1.getAnnotations (); // รับคำอธิบายประกอบทั้งหมดของคำอธิบายประกอบวัตถุทั้งหมด = class1.getAnnotation (เลิกใช้แล้ว); // รับคำอธิบายประกอบที่ระบุ class1.getGenericInterfaces (); // รับประเภทคอลเลกชันของอินเทอร์เฟซทั้งหมดของวัตถุคลาส 4. ) การสร้างวัตถุคลาสแบบไดนามิก
// วิธีแรกของวัตถุคลาสเรียกวิธี newInstance () เพื่อสร้างวัตถุ obj = class1.newinstance (); // วิธีที่สองของวัตถุได้รับวัตถุสร้างที่สอดคล้องกันแล้วสร้างตัวสร้าง <?> constructor = class1.getDeclaredConstructor Constructor.NewInstance (วัตถุใหม่ [] {"LCJ"});5. ) ฟังก์ชั่นการโทรแบบไดนามิก
ลอง {// สร้างวัตถุใหม่: ใช้ Newinstance () Method Object obj = class1.newinstance (); // ตัดสินว่าวัตถุนั้นเป็นคลาสย่อยของบูลีนของบุคคล isinstanceof = obj อินสแตนซ์ของบุคคล; // ก่อนอื่นคุณต้องได้รับวิธีการที่สอดคล้องกับวิธีวิธีวิธีวิธีวิธี = class1.getDeclaredMethod ("setage", คลาสใหม่ [] {int.class}); // เรียกฟังก์ชั่นที่ระบุและผ่านวิธีพารามิเตอร์ invoke (obj, 28); วิธี = class1.getDeclaredMethod ("getage"); Object result = method.invoke (obj, คลาสใหม่ [] {});} catch (instantiationexception e) {e.printstacktrace ();} catch (ungloralaccessexception e) {e.printstacktrace ()} catch (nosuchmethodexception e) E.PrintStackTrace ();} 6. ) รับประเภททั่วไปผ่านกลไกการสะท้อนกลับ
ตัวอย่างเช่นโครงสร้างต่อไปนี้
// คนชั้นเรียนระดับประชาชนคนชั้นเรียน <T> {} // คลาสบุคคลสืบทอดบุคคลชั้นเรียนระดับประชาชนคนชั้นเรียน <T> ขยายผู้คน <string> ใช้ PersonInterface <Integer> {} // PersonInterface อินเตอร์เฟสสาธารณะรับประเภททั่วไป
บุคคล <string> person = บุคคลใหม่ <> (); // วิธีแรกคือการใช้ Object GetClass Method Class <?> class1 = person.getClass (); พิมพ์ genericsuperClass = class1.getGenericsuperClass (); // รับ typeType [] interfacetypes = class1.getGenericInterfaces (); // รับเรียงพิมพ์ของอินเทอร์เฟซทั้งหมดของวัตถุคลาส getComponentType getComponentType (interfacetypes [0]);
การใช้งาน getComponentType
คลาสส่วนตัว <?> getComponentType (ประเภทประเภท) {คลาส <?> componentYpe = null; ถ้า (พิมพ์อินสแตนซ์ของพารามิเตอร์ parameterizedType) {// getActualTypeArguments () ส่งคืนอาร์เรย์ของประเภทวัตถุที่แสดงถึงพารามิเตอร์ประเภทจริงของประเภทนี้ ประเภท [] realTyPeArguments = ((parameterizedType) ประเภท) .getActualTuterGuments (); if (realTyPeArguments! = null && realTyTyPeArguments.length> 0) {componentYpe = (คลาส <?>) ualTyTyPeArguments [0]; }} อื่นถ้า (ประเภทอินสแตนซ์ของ genericArrayType) {// ประเภทอาร์เรย์ที่แสดงถึงประเภทองค์ประกอบที่เป็นประเภทพารามิเตอร์หรือประเภทตัวแปรส่วนประกอบ typonentType = (คลาส <?>) ((genericArraytype) ประเภท). getGenericComponentTypepe (); 6. ) รับข้อมูลคำอธิบายประกอบผ่านกลไกการสะท้อนกลับ
ที่นี่เรามุ่งเน้นไปที่การได้รับข้อมูลคำอธิบายประกอบของวิธีการเป็นตัวอย่าง
ลอง {// ก่อนอื่นคุณต้องได้รับวัตถุวิธีการที่สอดคล้องกับวิธีการวิธีการนี้ = class1.getDeclaredMethod ("JumptogoodsDetail", คลาสใหม่ [] {string.class, string.class}); คำอธิบายประกอบ [] คำอธิบายประกอบ 1 = method.getAnnotations (); // รับข้อมูลคำอธิบายประกอบทั้งหมดหมายถึงคำอธิบายประกอบ 1 = method.getAnnotation (routeruri.class); // รับข้อมูลคำอธิบายประกอบที่ระบุไว้ คำอธิบายประกอบ [] [] parameterAnnotationsArray = method.getParameterannotations (); // รับข้อมูลคำอธิบายประกอบพารามิเตอร์ทั้งหมด <?> [] parameterTypes = method.getParameterTypes (); // รับประเภทพารามิเตอร์ทั้งหมด method.getReturntype (); // รับประเภทการส่งคืนของวิธีการ method int = method.getModifiers (); // รับสิทธิ์การเข้าถึงของวิธี} catch (nosuchmethodexception e) {e.printstacktrace ();};};สถานการณ์แอปพลิเคชันของกลไกการสะท้อน:
ข้อดีและข้อเสียของกลไกการสะท้อน:
ข้อดี: การตัดสินประเภทรันไทม์การโหลดคลาสแบบไดนามิกและการสะท้อนการใช้พร็อกซีแบบไดนามิก
ข้อเสีย: ประสิทธิภาพเป็นปัญหา การสะท้อนนั้นเทียบเท่ากับชุดของการดำเนินการคำอธิบาย การแจ้ง JVM เกี่ยวกับสิ่งที่ต้องทำประสิทธิภาพช้ากว่ารหัส Java โดยตรง
สรุป:
กลไกการสะท้อนกลับของ Java นั้นไม่ค่อยมีการใช้ในการพัฒนาธุรกิจประจำวัน แต่มีการใช้กันอย่างแพร่หลายในการสร้างกรอบพื้นฐานบางอย่าง วันนี้ฉันสรุปสั้น ๆ และเรียนรู้และยังมีความรู้ที่ไม่รู้จักมากมายที่จะใช้ในภายหลังเพื่อเสริม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น