บทความนี้จัดระเบียบจุดความรู้สำหรับตัวแทนไดนามิก Java เนื้อหาเฉพาะมีดังนี้
1. Java Dynamic Proxy (คำแถลงอย่างเป็นทางการเปรียบเทียบ)
โมเดลพร็อกซีเป็นรูปแบบการออกแบบ Java ที่ใช้กันทั่วไป ลักษณะของมันคือคลาสพร็อกซีและคลาสตัวแทนมีอินเทอร์เฟซเดียวกัน คลาสพร็อกซีส่วนใหญ่มีหน้าที่รับผิดชอบในการประมวลผลข้อความล่วงหน้าการกรองข้อความการส่งต่อข้อความไปยังคลาสผู้ได้รับมอบหมายและการประมวลผลข้อความหลังจากเหตุการณ์ มักจะมีความสัมพันธ์ระหว่างคลาสพร็อกซีและคลาสผู้แทน เป้าหมายของคลาสพร็อกซีเกี่ยวข้องกับวัตถุของคลาสตัวแทน วัตถุประสงค์ของคลาสพร็อกซีนั้นไม่ได้ใช้บริการอย่างแท้จริง แต่ให้บริการเฉพาะโดยเรียกใช้วิธีการที่เกี่ยวข้องของวัตถุคลาสตัวแทน
ตามระยะเวลาของการสร้างเอเจนต์คลาสตัวแทนสามารถแบ่งออกเป็นสองประเภท
พร็อกซีแบบคงที่: สร้างโดยโปรแกรมเมอร์หรือสร้างซอร์สโค้ดโดยอัตโนมัติด้วยเครื่องมือเฉพาะและรวบรวม ก่อนที่โปรแกรมจะทำงานไฟล์. class ของคลาสพร็อกซีจะมีอยู่แล้ว
พร็อกซีแบบไดนามิก: มันถูกสร้างขึ้นแบบไดนามิกโดยใช้กลไกการสะท้อนเมื่อโปรแกรมทำงาน
2. การใช้งานพร็อกซีแบบไดนามิก
java.lang.reflect.proxy
พร็อกซีให้วิธีการคงที่สำหรับการสร้างคลาสพร็อกซีแบบไดนามิกและอินสแตนซ์
Newproxyinstance ()
ส่งคืนอินสแตนซ์ของคลาสพร็อกซีของอินเทอร์เฟซที่ระบุที่สามารถกำหนดวิธีการเรียกใช้วิธีการเรียกใช้ตัวจัดการการโทรที่ระบุ
2.1. อินเทอร์เฟซ DAO (ให้อินเทอร์เฟซเลเยอร์การเข้าถึงข้อมูลแบบจำลอง)
แพ็คเกจ javaproxy;/** กำหนดอินเตอร์เฟสเลเยอร์การเข้าถึงข้อมูล*/อินเทอร์เฟซสาธารณะ dao {// จำลองการบันทึกข้อมูลโมฆะสาธารณะบันทึก ();} 2.2. คลาสการใช้งานคลาส Daoimpl
แพ็คเกจ Javaproxy; คลาสสาธารณะ Daoimpl ใช้ dao {@Override โมฆะสาธารณะบันทึก () {system.out.println ("ดำเนินการวิธีการบันทึก ................ "); - 2.3. คลาสการประมวลผลตัวแทน
แพ็คเกจ Javaproxy; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; คลาสสาธารณะ Daohandler ใช้ InvocationHandler {วัตถุส่วนตัว obj; daohandler สาธารณะ (Object obj) {this.obj = obj;} @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีการ, วัตถุ [] args) โยน throwable {system.out.println ( args); System.out.println ("ทำบางสิ่งบางอย่างหลังจากวิธีการ"); // โพสต์-วิธีการของ AOP ถูกจำลองที่นี่ Return Ret; - 2.4. โทรหาลูกค้า
แพ็คเกจ Javaproxy; นำเข้า java.lang.reflect.proxy; ไคลเอนต์ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// metaobject (วัตถุพร็อกซ์) daoimpl daoimpl = new daoimpl (); // ธุรกิจพร็อกซีคลาส daohandler daohandler = ใหม่ daohandler (daoimpl); dao dao = (dao) proxy.newproxyinstance (daoimpl .getclass (). getclassloader (), daoimpl.getClass () .getInterfaces (), daohandler); dao.save (); -2. 5. ผลลัพธ์
3. จำลองการใช้งานพร็อกซีใน mybatis
3.1. Mapperproxy Class
แพ็คเกจ javaproxy; นำเข้า java.lang.reflect.invocationhandler นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; คลาสสาธารณะ mappreproxy ใช้การใช้งาน Interting {@suppresswarnings ( @Param: วิธีการดำเนินการด้วย sqlsession** @return: ส่งคืนวัตถุพร็อกซี*/ สาธารณะคงที่ <t> t newmapperproxy (คลาส <t> mapperinterface, Object SQLSession) {classloader classloader = MapperInterface.getClassLoader (); คลาส <?> [] อินเทอร์เฟซ = คลาสใหม่ [] {mapperInterface}; mapperproxy proxy = new mapperproxy (); Return (t) Proxy.newProxyInstance (classloader, อินเตอร์เฟส, พร็อกซี); } / * * (ไม่ใช่ javadoc) * * @see java.lang.reflect.invocationhandler#archoke (java.lang.object, * java.lang.reflect.method, java.lang.object [] * @param ค้นหาแผนที่พารามิเตอร์ที่สอดคล้องกัน** @return: ส่งคืนวัตถุพารามิเตอร์ที่ดำเนินการ*/ วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีเมธอด, วัตถุ [] args) โยน throwable {// ที่นี่การดำเนินการที่สอดคล้องกันจะดำเนินการโดยการแยกวิเคราะห์ Mapper ที่เกี่ยวข้องผ่านชื่อเมธอดและพารามิเตอร์ คืนค่า null; - 3.2. ลูกค้า
แพ็คเกจ Javaproxy; นำเข้า java.lang.reflect.proxy; ไคลเอนต์ระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {dao dao = mapperproxy.newmapperproxy (dao.class, null); dao.save (); -3.3. ผลลัพธ์
ข้างต้นเป็นตัวอย่างของการใช้พร็อกซีไดนามิก JDK ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java