ทางเลือกในการ java.lang.reflect.Proxy สำหรับการสร้างพร็อกซีของคลาสนามธรรม (แทนที่จะเป็นอินเทอร์เฟซ)
ตามเอกสาร : [ 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); …