Java Dynamic Proxy ได้รับการอธิบายเกี่ยวกับ API ที่เชื่อมต่อกับ Java ดังนั้นฉันจะไม่เขียนที่นี่ สิ่งที่ฉันเข้าใจ:
ขยายฟังก์ชันการทำงานของวิธีการเฉพาะในอินเทอร์เฟซเฉพาะและนี่คือพร็อกซี พร็อกซีเป็นวิธีการโทรผ่านวัตถุ Handler Call ที่เชื่อมโยงกับอินสแตนซ์พร็อกซี
มาดูตัวอย่าง:
อินเทอร์เฟซ:
ส่วนต่อประสานสาธารณะ num {void show (); int getnum (); int getproduct (int x);} คลาสการใช้งาน:
คลาสสาธารณะ Mynum ใช้ num {@Override สาธารณะ int getNum () {return 3; } @Override สาธารณะ int getProduct (int x) {return x; } @Override โมฆะสาธารณะแสดง () {system.out.println ("วิธีการพื้นฐานพิมพ์หมายเลข 99"); - ก่อนอื่นให้ดูว่าวิธีการที่อธิบายไว้ใน API ได้อย่างไร
กล่าวคือตัวจัดการการโทรเรียกใช้วิธีการพื้นฐานที่แสดงถึงวัตถุวิธีการไปยังวัตถุคลาสการใช้งานของอินเทอร์เฟซ
วิธีแรกในการใช้งานพร็อกซี:
ชั้นเรียนสาธารณะ numproxy {วัตถุส่วนตัว num; // สร้างวัตถุคลาสการใช้งานของอินเทอร์เฟซผ่านวิธีตัวสร้าง numproxy สาธารณะ (Object Num) {this.num = num; } วัตถุสาธารณะ getNumByProxy () {Object numProxy = proxy.newProxyInstance (num.getClass (). getClassLoader (), คลาสใหม่ [] {num.class}, การ inhedler ใหม่ () { /*** วิธีการ: วิธีการที่สอดคล้องกับอินเตอร์เฟส อาร์เรย์พารามิเตอร์ของวิธีจริง*/ @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีการ, วัตถุ [] args) โยน {object obj = null; (จำนวนเต็ม) OBJ * 2; ส่งคืน numproxy; - วิธีที่สองในการใช้งานพร็อกซี: โดยการใช้อินเทอร์เฟซ InvocationHandler
คลาสสาธารณะ NumProxyImpl ใช้ raveCocationHandler {// ที่นี่ฉันได้กำหนดประเภทอินเตอร์เฟสและไม่ได้เขียนเป็น Object Private Num; public numproxyimpl (num num) {this.num = num; } @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) พ่น throwable {object obj = null; String methodName = method.getName (); if ("getProduct" .equals (methodName)) {system.out.println ("พร็อกซี: getProduct () เริ่มต้น"); obj = method.invoke (num, args); obj = (จำนวนเต็ม) obj * 2; System.out.println ("พร็อกซี: getProduct () สิ้นสุด"); } อื่นถ้า ("show" .equals (methodName)) {system.out.println ("พร็อกซี: แสดง () เริ่มต้น"); obj = method.invoke (num, args); System.out.println ("พร็อกซี: แสดง () สิ้นสุด"); } return obj; - รหัสทดสอบ:
Public Class TestNum {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ทดสอบ numproxy np = new numproxy (ใหม่ mynum ()); num numproxy = (num) np.getNumByProxy (); int x = numproxy.getProduct (2); System.out.println (x); numproxy.show (); System.out.println ("---------------------"); numproxyimpl npi = ใหม่ numproxyimpl (ใหม่ mynum ()); num numpro = (num) proxy.newproxyinstance (num.class.getClassLoader (), คลาสใหม่ [] {num.class}, npi); int n = numpro.getProduct (3); System.out.println (n); numpro.show (); - ผลลัพธ์ของคอนโซล:
วิธีที่สองสับสนเล็กน้อย ฉันไม่รู้ว่าคุณมีหรือไม่ นั่นคือมันถูกเรียกว่าวิธีการเรียกใช้ใน numproxyimpl ที่ไม่ได้แสดง แต่มันถูกดำเนินการ ใช่มาดูสิ่งนี้กันเถอะ
หากคุณไม่ต้องการลำบากเพียงจำไว้
ตัวอย่างเช่นกระบวนการเข้ารหัสสามารถใช้เพื่อใช้พร็อกซีและเขียนตัวอย่างในครั้งต่อไป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น