คำอธิบายสั้น ๆ
ฉันมักจะกังวลเกี่ยวกับการขาดกลไกการมอบอำนาจของ Java โชคดีที่ฉันมีเวลาเมื่อเร็ว ๆ นี้และเขียนโมดูลการมอบหมายอย่างง่ายพร้อมการสะท้อนกลับสำหรับการอ้างอิง
โมดูล API
ผู้แทนระดับสาธารณะ () // การก่อสร้างพารามิเตอร์ที่ว่างเปล่าคลาสนี้จัดการอินสแตนซ์ของผู้แทนและใช้วิธีการมอบหมาย // เพิ่มวิธีการคงที่ผู้แทนและส่งคืน ID ค่าจำนวนเต็มเพื่อแสดงอินสแตนซ์ที่ประกอบด้วยวิธีและพารามิเตอร์ หากล้มเหลวให้ส่งคืน -1 Public Synchronized int addFunctionDelegate (คลาส <?> srcclass, String MethodName, Object ... Params); // เพิ่มเมธอดอินสแตนซ์มอบหมายให้ส่งคืน ID ค่าจำนวนเต็มเพื่อแสดงอินสแตนซ์ที่ประกอบด้วยเมธอดและพารามิเตอร์ หากล้มเหลวให้ส่งคืน -1 public synchronized int addfunctiondelegate (Object srcobj, String Methodname, Object ... Params); // ลบวิธีการมอบหมายจากอินสแตนซ์ของผู้ได้รับมอบหมายจาก ID จำนวนเต็มและส่งคืนไม่ว่าจะประสบความสำเร็จ InvokeAllMethod (); // แปลงตารางพารามิเตอร์เป็นประเภทพารามิเตอร์ตารางส่วนตัวคลาสส่วนตัว <?> [] getParamtypes (วัตถุ [] พารามิเตอร์); // รับวิธีการอินสแตนซ์วิธีการส่วนตัวจากคลาสที่ระบุชื่อเมธอดและประเภทตารางพารามิเตอร์ Params) // delegatenode คลาสอธิบายถึงการมอบหมายวิธีการคงที่เมื่อไม่ได้ใช้การก่อสร้างวัตถุรวมถึงอินสแตนซ์เมธอดและตารางพารามิเตอร์ Class DelegAtenode (Object SRCOBJ, วิธีการ refMethod, Object [] params) // delegatenode คลาสอธิบายการมอบหมายวิธีการอินสแตนซ์เมื่อใช้การสร้างวัตถุรวมถึงอินสแตนซ์ของคลาสอินสแตนซ์เมธอดและตารางพารามิเตอร์
รหัสต้นฉบับ
นำเข้า java.lang.reflect.invocationTargetException; นำเข้า java.lang.reflect.method; นำเข้า java.util.hashtable;/** delegater คลาสใช้ rtti และการสะท้อนเพื่อใช้กลไกผู้แทนใน java*@author สามทาง Hashtable ตัวแปร <Integer, Delegatenode> Nodetable; // จัดการ ID และคอนเทนเนอร์ของ Delegater สาธารณะตัวแทนที่สอดคล้องกัน () {Nodetable = Hashtable ใหม่ <จำนวนเต็ม, delegatenode> ();} // เพิ่มวิธีการคงที่ {class <?> [] paramTypes = getParamTypes (params); วิธี refmethod; ถ้า ((refmethod = getDstMethod (srcclass, methodname, paramTypes))! = null) {register ++; nodetable.put (ลงทะเบียน วิธีการมอบหมายสาธารณะแบบซิงโครไนซ์สาธารณะ addfunctionDelegate (Object srcobj, String MethodName, Object ... Params) {class <?> [] paramTypes = getParamtypes (params); method refmethod; if (refmethod = getDStMethod (srcobj.getClass () {register ++; nodetable.put (ลงทะเบียน, ใหม่ Delegatenode (srcobj, refmethod, params)); return register;} else {return -1;}} // ลบวิธีการมอบหมายให้ Synchronized Public Synchronized Boolean returing.rotion.roteling) false;} // ดำเนินการวิธีการมอบหมายโมฆะ public synchronized public อย่างไม่เรียงลำดับเป็นโมฆะ invokeallmethod () {สำหรับ (delegatenode Node: Nodetable.values ()) {node.invokemethod () (converspes? = คลาสใหม่ <?> [params.length]; สำหรับ (int i = 0; i <params.length; i ++) {paramtypes [i] = params [i] .getClass ();} return paramTypes;} // รับอินสแตนซ์ของคลาส {method result = null; ลอง {result = srcclass.getMethod (methodName, paramtypes); ถ้า (result.getReturntype ()! = void.class) {system.out.println ("คำเตือน, วิธี:" methodname+" {system.out.println ("ไม่พบวิธีการ:"+methodname+", ตรวจสอบให้แน่ใจว่ามีอยู่และมองเห็นได้!");} ผลตอบแทนผลลัพธ์}}} คลาส Delegatenode {Object srcobj; วิธีการ refmethod; object [] params; publicelegatenode this.params = params;} public Delegatenode (Object srcobj, วิธีการ refmethod, object [] params) {this.srcobj = srcobj; this.refmethod = refmethod; this.params = params;} โมฆะสาธารณะ convokeMethod () {ลอง {refmethod.invoke (srcobj, params);} catch (unledalAccessException | unlegalArgumentException | inheadTargetException e) {system.out.println ("การทดสอบโมดูล
ชั้นเรียนสาธารณะ delegatertest {โมฆะสาธารณะ showinfo () {system.out.println ("Hello Delegate!");} โมฆะสาธารณะ showcustominfo (ข้อมูลสตริง) {system.out.println (ข้อมูล); showcustomstaticinfo (ข้อมูลสตริง) {system.out.println (ข้อมูล);} โมฆะคงที่สาธารณะ (สตริง [] args) {Delegater dele = new Delegater (); DelegaterTest Tester = New DelegaterTest (); int ID = dele.addfunctiondelegate (Tester, "showinfo"); dele.addfunctiondelegate (ผู้ทดสอบ, "showcustominfo", "custom!"); dele.addfunctiondelegate (Delegatertest.class, "showstaticinfo"); ondelegate (DelegaterTest.class, "Showcustomstaticinfo", "StaticCustom!"); dele.invokeallmethod (); dele.removemethod (id); system.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------ -ผลการดำเนินการ:
StaticCustom!
StaticDelegate!
กำหนดเอง!
Hellodelegate!
-
StaticCustom!
StaticDelegate!
กำหนดเอง!
เรื่องอื่น ๆ
วิธีการสาธารณะบางวิธีใช้การซิงโครไนซ์เพื่อให้แน่ใจว่าความปลอดภัยของเธรดของตัวแปรการลงทะเบียนเพื่อไม่ให้เกิดข้อผิดพลาดเนื่องจากหลายเธรด
จะมีการออกคำเตือนสำหรับผู้ได้รับมอบหมายที่มีค่าส่งคืน แต่โมดูลยังคงยอมรับการมอบหมายดังกล่าว แต่คุณจะไม่ได้รับค่าส่งคืนเมื่อดำเนินการตัวแทน
ค่าสูงสุดของตัวแทนที่เพิ่มเข้ามาคือกระบวนการยอมรับความผิดพลาดหลังจากจำนวนเต็ม max_value-integer.min_value ไม่ได้รับการพิจารณา (โดยทั่วไปมีฟังก์ชั่นไม่มากนักที่ต้องได้รับมอบหมาย
การดำเนินการที่ได้รับมอบหมายนั้นไม่เป็นระเบียบและเมื่อจำเป็นต้องมีข้อกำหนดด้านประสิทธิภาพพยายามอย่าบล็อกฟังก์ชั่นที่ได้รับมอบหมายมิฉะนั้นจะส่งผลกระทบต่อการดำเนินการของฟังก์ชั่นอื่น ๆ ที่ได้รับมอบหมาย
คำถามอื่น ๆ สามารถโพสต์เพื่อพูดคุย
สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของบทความนี้เกี่ยวกับการใช้รหัสกลไกผู้แทนใน Java ผ่านการสะท้อนกลับ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องกับ Java ในเว็บไซต์นี้ หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!