Java Dynamic Proxy Class ตั้งอยู่ภายใต้แพ็คเกจ java.lang.reflect และโดยทั่วไปส่วนใหญ่เกี่ยวข้องกับสองคลาสต่อไปนี้:
(1) InvocationHandler: มีเพียงวิธีเดียวเท่านั้นที่กำหนดไว้ในอินเทอร์เฟซนี้
วัตถุสาธารณะเรียกใช้ (Object OBJ, วิธีการ, วัตถุ [] args)
ในการใช้งานจริงพารามิเตอร์แรก OBJ โดยทั่วไปหมายถึงคลาสพร็อกซีวิธีการเป็นวิธีพร็อกซีเช่นการร้องขอ () ในตัวอย่างข้างต้น args เป็นอาร์เรย์พารามิเตอร์ของวิธี วิธีนามธรรมนี้ถูกนำไปใช้แบบไดนามิกในคลาสพร็อกซี
(2) พร็อกซี: คลาสนี้เป็นคลาสพร็อกซีแบบไดนามิกและฟังก์ชั่นของมันคล้ายกับ proxysubject ในตัวอย่างข้างต้นซึ่งส่วนใหญ่มีเนื้อหาต่อไปนี้ได้รับการป้องกันพร็อกซี (InvocationHandler H): ตัวสร้างที่ใช้กำหนดค่าให้กับค่า ภายใน
คลาสคงที่ getProxyClass (classloader loader, คลาส [] อินเตอร์เฟส)
รับคลาสพร็อกซีที่โหลดเดอร์เป็นตัวโหลดคลาสและอินเทอร์เฟซเป็นอาร์เรย์ของอินเทอร์เฟซทั้งหมดที่เป็นเจ้าของโดยคลาสจริง
วัตถุแบบคงที่ newproxyinstance (classloader loader, คลาส [] อินเตอร์เฟส, InvocationHandler H)
ส่งคืนอินสแตนซ์ของคลาสพร็อกซี
พร็อกซีแบบไดนามิกที่เรียกว่าเป็นคลาส: มันเป็นคลาสที่สร้างขึ้นที่รันไทม์ แน่นอนคุณสามารถใช้อินสแตนซ์ของคลาสเป็นอินเทอร์เฟซเหล่านี้ แน่นอนว่าพร็อกซีแบบไดนามิกนี้เป็นพร็อกซีซึ่งจะไม่ทำงานที่สำคัญสำหรับคุณ
เมื่อใช้คลาสพร็อกซีแบบไดนามิกเราต้องใช้อินเตอร์เฟส InvocationHandler:
ดูโปรแกรมหัวเรื่อง. java
ดูโปรแกรม realsubject.java
ดูโปรแกรม DynamicsUbject.java
ดูโปรแกรม client.java
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
// บทคัดย่อบทบาท (ก่อนหน้านี้เป็นคลาสนามธรรมควรเปลี่ยนเป็นอินเทอร์เฟซที่นี่):
หัวเรื่องสาธารณะ
-
บทคัดย่อคำขอโมฆะสาธารณะ ();
-
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
// บทบาทเฉพาะ
ระดับสาธารณะ realsubject ใช้เรื่องหัวเรื่อง
-
Realsubject สาธารณะ ()
-
-
คำขอโมฆะสาธารณะ ()
-
System.out.println ("จากเรื่องจริง");
-
-
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
นำเข้า java.lang.reflect.invocationhandler;
นำเข้า java.lang.reflect.method;
// โปรเซสเซอร์พร็อกซี
-
* คุณสมบัติภายในของคลาสพร็อกซีคือคลาสวัตถุ
* นอกจากนี้วิธีการเรียกใช้ยังใช้ในคลาสนี้, method.invoke (sub, args);
* ในความเป็นจริงมันคือการเรียกวิธีการที่จะดำเนินการโดยวัตถุพร็อกซี
* ARGS เป็นพารามิเตอร์ที่จำเป็นในการดำเนินการที่สอดคล้องกันของวัตถุพร็อกซี
* ผ่านคลาสพร็อกซีแบบไดนามิกเราสามารถดำเนินการที่เกี่ยวข้องก่อนหรือหลังการโทร
-
Public Class DynamicsUbject ใช้ InvocationHandler
-
วัตถุย่อยส่วนตัว;
Public DynamicsUbject ()
-
-
Public DynamicsUbject (Object OBJ)
-
sub = obj;
-
วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยนได้
-
System.out.println ("ก่อนโทร" + เมธอด);
method.invoke (sub, args);
System.out.println ("หลังจากโทร" + วิธี);
คืนค่า null;
-
-
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
นำเข้า java.lang.reflect.invocationhandler;
นำเข้า java.lang.reflect.proxy;
//ลูกค้า
ลูกค้าชั้นเรียนสาธารณะ
-
โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนได้
-
RealSubject RS = ใหม่ RealSubject (); // ระบุคลาสพร็อกซีที่นี่
InvocationHandler ds = new DynamicsUbject (RS);
คลาส <s?> cls = rs.getClass ();
// ต่อไปนี้เป็นตัวแทนการสร้างครั้งเดียว
หัวเรื่องหัวเรื่อง = (หัวเรื่อง) พร็อกซีใหม่ NewProxyInstance (
cls.getClassLoader (), cls.getInterfaces (), ds);
หัวเรื่อง. request ();
-
-
ตัวอย่างที่ 2:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
นำเข้า java.lang.reflect.invocationhandler;
นำเข้า java.lang.reflect.method;
นำเข้า java.lang.reflect.proxy;
นำเข้า java.util.list;
นำเข้า java.util.vector;
Vectorproxy ระดับสาธารณะใช้ achecesshandler
-
Proxyobj วัตถุส่วนตัว;
Public VectorProxy (Object OBJ) {
proxyobj = obj;
-
โรงงานวัตถุสาธารณะคงที่ (Object OBJ) {
คลาส <?> cls = obj.getClass ();
ส่งคืน proxy.newproxyinstance (cls.getclassloader (), cls.getinterfaces (), vectorproxy ใหม่ (OBJ));
-
วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยน {
System.out.println ("ก่อนโทร" + เมธอด);
ถ้า (args! = null) {
สำหรับ (int i = 0; i <args.length; i ++) {
System.out.println (args [i] + "");
-
-
Object Object = method.invoke (proxyobj, args);
System.out.println ("หลังจากโทร" + วิธี);
วัตถุกลับ;
-
@suppresswarnings ("ไม่ได้ตรวจสอบ")
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
รายการ <String> v = (รายการ <String>) โรงงาน (เวกเตอร์ใหม่ <String> (10));
v.add ("ใหม่");
V.add ("York");
System.out.println (V);
V.Remove (0);
System.out.println (V);
-
-
ตัวอย่างที่ 3
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.langsin.dynamicproxy;
อินเทอร์เฟซสาธารณะ foo {
โมฆะ doaction ();
-
แพ็คเกจ com.langsin.dynamicproxy;
Public Class Fooimpl ใช้ foo {
public fooimpl () {
-
โมฆะสาธารณะ doaction () {
System.out.println ("ใน fooimp1.doaction ()");
-
-
แพ็คเกจ com.langsin.dynamicproxy;
Public Class Fooimpl2 ใช้ foo {
public fooimpl2 () {
-
โมฆะสาธารณะ doaction () {
System.out.println ("ใน fooimp2.doaction ()");
-
-
แพ็คเกจ com.langsin.dynamicproxy;
นำเข้า java.lang.reflect.invocationhandler;
นำเข้า java.lang.reflect.method;
คลาสสาธารณะ CommonInvocationHandler ใช้ InvocationHandler {
// การดำเนินการแบบไดนามิกของวัตถุวัตถุที่ต้องการการเรียกกลับ
เป้าหมายวัตถุส่วนตัว
// สนับสนุนการฉีดคอนสตรัคเตอร์
สาธารณะทั่วไป
-
// สนับสนุนการฉีดคอนสตรัคเตอร์
PublicinVocationHandler (เป้าหมายวัตถุ) {
Settarget (เป้าหมาย);
-
-
-
* ใช้วิธีการตั้งค่าเพื่อฉีด
-
* @param เป้าหมาย
-
-
โมฆะสาธารณะ Settarget (เป้าหมายวัตถุ) {
this.target = เป้าหมาย;
-
-
-
* เรียกวิธีการที่ระบุในพร็อกซีและส่งผ่านในรายการพารามิเตอร์ args
-
* @param พร็อกซี
* ประเภทของคลาสพร็อกซีเช่นการกำหนดอินเทอร์เฟซพร็อกซีที่สอดคล้องกับวิธีการ
-
* @param method
* วิธีการเป็นพร็อกซี
-
* @param args
* พารามิเตอร์ที่เรียกวิธีพร็อกซี
-
* @กลับ
-
* @throws java.lang.hrowable
-
-
วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยน {
return method.invoke (เป้าหมาย, args);
-
-
แพ็คเกจ com.langsin.dynamicproxy;
นำเข้า java.lang.reflect.proxy;
การสาธิตชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
// 1. การใช้งานพร็อกซีแบบไดนามิกทั่วไปทั่วไป
CommonInvocationHandler Handler = New CommonInvocationHandler ();
foo f;
// 2. การใช้งานอินเตอร์เฟส 1
handler.settarget (ใหม่ fooimpl ());
// เมธอดพารามิเตอร์คำอธิบาย: คลาสพร็อกซี, รายการการใช้งานระดับพร็อกซี, โปรเซสเซอร์คลาสพร็อกซี
// เชื่อมโยงคลาสพร็อกซีวิธีการอินเตอร์เฟสและโปรเซสเซอร์ในคลาสพร็อกซี
// หากคลาสพร็อกซีไม่ได้ใช้รายการอินเตอร์เฟสที่ระบุจะมีการโยนข้อยกเว้นพารามิเตอร์ที่ผิดกฎหมาย
f = (foo) proxy.newproxyinstance (foo.class.getclassloader ()
คลาสใหม่ [] {foo.class}
ตัวจัดการ);
f.doaction ();
// 3. การใช้งานอินเตอร์เฟส 2
handler.settarget (ใหม่ fooimpl2 ());
f = (foo) proxy.newproxyinstance (foo.class.getclassloader ()
คลาสใหม่ [] {foo.class}
ตัวจัดการ);
f.doaction ();
-
-
เพราะฉันมีความสามารถทางวรรณกรรมที่ จำกัด เนื้อหาส่วนใหญ่เป็นรหัส