ตามเอกสาร :
[
java.lang.reflect.
]Proxy
จัดเตรียมเมธอดแบบคงที่สำหรับการสร้างคลาสพร็อกซีและอินสแตนซ์แบบไดนามิกและยังเป็นซูเปอร์คลาสของคลาสพร็อกซีแบบไดนามิกทั้งหมดที่สร้างโดยเมธอดเหล่านั้น
newProxyMethod
วิธี (รับผิดชอบในการสร้างผู้รับมอบฉันทะแบบไดนามิก) มีลายเซ็นต่อไปนี้:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
น่าเสียดายที่สิ่งนี้ป้องกันไม่ให้สร้างพร็อกซีแบบไดนามิกที่ขยายคลาสนามธรรมเฉพาะ (แทนที่จะใช้อินเทอร์เฟซเฉพาะ) สิ่งนี้สมเหตุสมผลเมื่อพิจารณาว่าjava.lang.reflect.Proxy
เป็น "superclass ของไดนามิกพร็อกซีทั้งหมด" ดังนั้นจึงป้องกันไม่ให้คลาสอื่นเป็นซูเปอร์คลาส
ดังนั้นมีทางเลือกอื่นjava.lang.reflect.Proxy
ที่สามารถสร้างพร็อกซีแบบไดนามิกที่สืบทอดมาจากคลาสนามธรรมเฉพาะโดยเปลี่ยนเส้นทางการเรียกทั้งหมดไปยังเมธอดนามธรรมไปยังตัวจัดการการเรียกใช้หรือไม่
ตัวอย่างเช่นสมมติว่าฉันมีคลาสนามธรรมDog
:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
มีชั้นเรียนที่อนุญาตให้ฉันทำสิ่งต่อไปนี้หรือไม่?
Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h);
dog.fetch(); // Will be handled by the invocation handler
dog.bark(); // Will NOT be handled by the invocation handler