เมื่อพูดถึง AOP คุณจะนึกถึงฤดูใบไม้ผลิอย่างแน่นอนเพราะสิ่งนี้ทรงพลังเกินไป แต่คุณต้องชัดเจนว่า AOP เป็นแนวคิดการเขียนโปรแกรมและฤดูใบไม้ผลิเป็นเพียงการดำเนินการของ AOP
ครั้งแรก Baidu:
ในอุตสาหกรรมซอฟต์แวร์ AOP เป็นตัวย่อของการเขียนโปรแกรมที่มุ่งเน้นด้านซึ่งหมายความว่า: เทคโนโลยีที่ใช้การบำรุงรักษาฟังก์ชั่นโปรแกรมแบบครบวงจรผ่านวิธีการ precompilation และตัวแทนไดนามิกในระหว่างการรันไทม์ AOP เป็นความต่อเนื่องของ OOP หัวข้อร้อนแรงในการพัฒนาซอฟต์แวร์ส่วนสำคัญของกรอบฤดูใบไม้ผลิและกระบวนทัศน์อนุพันธ์ของการเขียนโปรแกรมที่ใช้งานได้ ส่วนต่าง ๆ ของตรรกะทางธุรกิจสามารถแยกได้โดยใช้ AOP ซึ่งจะช่วยลดการมีเพศสัมพันธ์ระหว่างส่วนต่าง ๆ ของตรรกะทางธุรกิจการปรับปรุงความสามารถในการใช้ซ้ำของโปรแกรมและปรับปรุงประสิทธิภาพของการพัฒนา
วันนี้มาใช้ Java Native Proxy เพื่อใช้ฟังก์ชั่น AOP อย่างง่าย
ก่อนอื่นคุณต้องรู้ความรู้ด้านการสะท้อนพื้นฐานมิฉะนั้นคุณอาจรู้สึกสับสน
ไม่มีคำพูดอีกต่อไปเพียงเริ่มพิมพ์
ก่อนอื่นให้เขียนอินเทอร์เฟซง่ายๆ ชื่อคือ AnimalInterface ซึ่งใช้เพื่อประกาศวิธีการพื้นฐานบางอย่างในการควบคุมสัตว์
วิธีการเหล่านี้รวมถึงการตั้งค่าชื่อการได้รับชื่อการเรียกและคุณลักษณะ (ให้อภัยฉันที่ไม่ได้รับการศึกษาในความเป็นจริงมันคือการได้รับไม่ว่าจะเป็นภาคพื้นดินหรือน้ำหรือสะเทินน้ำสะเทินบก)
แพ็คเกจ proxy.imp; อินเทอร์เฟซสาธารณะ AnimalInterface {// ตั้งชื่อ void setName (ชื่อสตริง); // รับสตริงชื่อ getName (); // Call Void พูดว่า (); // รับโมฆะถาวร getProperty ();}จากนั้นเราใช้อินเทอร์เฟซนี้และสร้างสุนัขชื่อ Xiao Hei
แพ็คเกจพร็อกซี; นำเข้า Proxy.imp.animalInterface; Dogimp ระดับสาธารณะใช้ AnimalInterface {ชื่อสตริงส่วนตัว = "Xiaohei"; public dogimp () {} @Override โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } @Override สตริงสาธารณะ getName () {return this.name; } @Override โมฆะสาธารณะบอกว่า () {system.out.println ("ลูกสุนัข: ผ้าขนสัตว์ขนสัตว์ขนสัตว์ ...... "); } @Override โมฆะสาธารณะ getProperty () {system.out.println ("ลูกสุนัขเป็นสัตว์ที่ดิน แต่สามารถว่ายน้ำได้"); - ทุกคนต้องใจร้อนที่จะตระหนักถึงฟังก์ชั่นเหมือน AOP ...
ก่อนอื่นให้สร้างคลาสที่เรียกว่า Aophandle เพื่อใช้อินเตอร์เฟส InvocationHandler เมื่อคุณไม่สามารถใช้ Invoke, พร็อกซีเป็นพารามิเตอร์การสะท้อนได้เนื่องจากอินเทอร์เฟซของวัตถุพร็อกซีนั้นแตกต่างจากวัตถุกลไกพร็อกซีนี้เป็นอินเทอร์เฟซที่มุ่งเน้นมากกว่าที่จะมุ่งเน้นคลาส หากคุณใช้พร็อกซีมันจะทำให้เกิดการเรียกซ้ำที่ไม่มีที่สิ้นสุด จากนั้นก็มีสแต็คล้น แต่ก็ยังสามารถสะท้อนได้สำเร็จเพียงครั้งเดียว นี่แสดงให้เห็นว่าวัตถุพร็อกซีและพร็อกซีของวัตถุนั้นแตกต่างกัน อย่างไรก็ตามเราสามารถรับวัตถุคลาสผ่าน proxy.getClass () ของพารามิเตอร์พร็อกซีจากนั้นรับวิธีการและพารามิเตอร์ของคลาสพร็อกซี นอกจากนี้ยังมีวิธีการใช้งานสำหรับการฉีดคำอธิบายประกอบการฉีดวิธีการเฉพาะและการฉีดแอตทริบิวต์ มาพูดถึงเรื่องนี้ในภายหลัง
แพ็คเกจพร็อกซี; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; คลาสสาธารณะ Aophandle ใช้การ InvocationHandler {// บันทึกวัตถุส่วนตัว o วัตถุ o; Aophandle สาธารณะ (Object O) {this.o = o; } /*** วิธีนี้จะถูกเรียกโดยอัตโนมัติกลไกพร็อกซีแบบไดนามิก Java จะถูกส่งผ่านในพารามิเตอร์ต่อไปนี้* @param Object พร็อกซีอินเทอร์เฟซของวัตถุพร็อกซีแตกต่างจากวิธีการของวัตถุ* @param วิธีการที่เรียกว่า method* @param วัตถุ กลไกพร็อกซีนี้เป็นอินเทอร์เฟซที่มุ่งเน้นไม่ใช่คลาสที่มุ่งเน้น **/@Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยน {// วิธีการส่งคืนค่าวัตถุ ret = null; // พิมพ์ชื่อวิธีการ System.err.println ("วิธีการดำเนินการ:"+method.getName ()+"ประเภทพารามิเตอร์ N คือ:"); // พิมพ์พารามิเตอร์สำหรับ (ประเภทคลาส: method.getParameterTypes ()) System.err.println (type.getName ()); // พิมพ์ประเภท return system.err.println ("ส่งคืนประเภทข้อมูล:"+method.getReturntype (). getName ()); // วิธีการโทรกลับ RET = method.invoke (o, args); // ประกาศ end system.err.println ("Method Execution End"); // ส่งคืนค่าส่งคืนของวิธีการโทรแบบสะท้อนกลับ RET; -พร็อกซีแบบไดนามิกเสร็จสมบูรณ์แล้ว ... จากนั้น Animantfactory ของเรา ... และมาทำต่อไป
พร็อกซี; นำเข้า java.lang.reflect.proxy; คลาสสาธารณะ AnimalFactory { /**** รับวิธีการวัตถุ* @param obj* @return* /วัตถุคงที่ส่วนตัว getanimalbase (Object obj) {// รับพร็อกซี ใหม่ Aophandle (OBJ)); } / **** รับเมธอดวัตถุ* @param obj* @return* / @suppresswarnings ("ไม่ถูกตรวจสอบ") สาธารณะคงที่ t getanimal (Object obj) {return (t) getanimalbase (obj); } / **** รับเมธอดวัตถุ* @param classname* @return* / @suppresswarnings ("ไม่ได้ตรวจสอบ") สาธารณะคงที่ t getanimal (คลาสสตริงคลาส) {Object obj = null; ลอง {obj = getanimalBase (class.forName (className) .newInstance ()); } catch (exception e) {e.printstacktrace (); } return (t) obj; } / **** รับเมธอดวัตถุ* @param clz* @return* / @suppresswarnings ("ไม่ได้ตรวจสอบ") สาธารณะคงที่ t getanimal (คลาส clz) {object obj = null; ลอง {obj = getanimalbase (clz.newinstance ()); } catch (exception e) {e.printstacktrace (); } return (t) obj; - ในที่สุดก็ถึงจุดจบ ... มีอะไรหายไป? มาที่นี่เพื่อดูเอฟเฟกต์ ...
ฮ่าฮ่า ... บริกรฉันจะรับใช้ ... โอ้ ~ ไม่มันเป็นหมวดหมู่การทดสอบ ... ฮ่าฮ่า ///
แพ็คเกจพร็อกซี; นำเข้า org.junit.test; นำเข้า org.junit.runner.runwith; นำเข้า org.junit.runners.blockjunit4classrunner; นำเข้าพร็อกซี AnimalInterface Dog = AnimalFactory.getanimal (dogimp.class); Dog.Say (); System.out.println ("ชื่อของฉันคือ"+dog.getName ()); dog.setName ("ergouzi"); System.out.println ("ชื่อของฉันคือ"+dog.getName ()); - อะไร ในท้ายที่สุดสิ่งนี้มีประโยชน์อะไรนี่ไม่ใช่เคล็ดลับ? เพียงแค่จับสิ่งนี้สิ่งที่ใช้ ...
AOP แบบไหนทำไมฉันไม่เห็น AOP ฉันจะป้อนวิธีที่กำหนดเองได้อย่างไร เพียงแค่อินพุต Syso และหลอกผู้ชมในเรื่องนี้? ….
โอเคไปข้างหน้าและดูวิธีการใช้วิธีการที่กำหนดเองที่ฉีด ...
ก่อนอื่นให้เพิ่มอินเทอร์เฟซเรียกมันว่าอินเทอร์เฟซฉีด AOP ตั้งชื่อมัน aopmethod
สร้างหลังและก่อนวิธีการรับพร็อกซีวัตถุวิธีวิธีการวัตถุ [] args พารามิเตอร์
สิ่งนี้จะทำสิ่งต่าง ๆ มากขึ้น ... ตัวอย่างเช่นก่อนที่จะดำเนินการวิธีการบันทึกสถานะคลาสเขียนบันทึก ตรวจสอบตัวแปร xx ,,,
เปิดสมองของคุณ
แพ็คเกจ proxy.imp; นำเข้า java.lang.reflect.method; อินเทอร์เฟซสาธารณะ aopmethod {// วิธีการดำเนินการก่อนที่วิธีการอินสแตนซ์จะถูกดำเนินการเป็นโมฆะหลังจาก (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args); // วิธีการที่ดำเนินการหลังจากวิธีการอินสแตนซ์ถูกดำเนินการเป็นโมฆะก่อน (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args);} จากนั้นปรับเปลี่ยนคลาส Aophandle และเพิ่มคุณสมบัติ AOPMethod
ปรับเปลี่ยนวิธีตัวสร้างเพื่อให้ได้อินสแตนซ์ AOPMethod เมื่อเริ่มต้นคลาส
ในที่สุดก็แก้ไขวิธีการเรียกใช้ .... ไปที่รหัสโดยตรง
แพ็คเกจพร็อกซี; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้าพร็อกซี. imp.aopmethod; คลาสสาธารณะ Aophandle ดำเนินการ InvocationHandler {// บันทึกวิธีการส่วนตัว AopMethod; วัตถุส่วนตัว o; Aophandle สาธารณะ (Object O, Aopmethod method) {this.o = o; this.method = วิธีการ; } /*** วิธีนี้จะถูกเรียกโดยอัตโนมัติกลไกพร็อกซีของ Java Dynamic* พารามิเตอร์ต่อไปนี้จะถูกส่งผ่านใน* @param Object พร็อกซีอินเตอร์เฟสของวัตถุพร็อกซีแตกต่างจากวิธีการของวัตถุ* @param วิธีการใช้วิธีการของอินเตอร์เฟส เป็นอินเทอร์เฟซที่มุ่งเน้นไม่ใช่คลาสที่มุ่งเน้น **/ @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยนได้ {object ret = null; // สถานที่ดัดแปลงอยู่ที่นี่วิธีนี้มาก่อน (พร็อกซี, วิธี, args); ret = method.invoke (o, args); // สถานที่ดัดแปลงอยู่ที่นี่ method.at. หลังจาก (พร็อกซี, วิธี, args); ผลตอบแทนผลตอบแทน; - ฮะงานเสร็จแล้วดูเหมือนว่าทุกอย่างเป็นปัญหาน่ารัก ...
อัปเดตคลาสทดสอบทันที ...
แพ็คเกจพร็อกซี; นำเข้า java.lang.reflect.method; นำเข้า org.junit.runner.runwith; นำเข้า org.junit.runners.blockjunit4classrunner; นำเข้า proxy.imp.aopmethod; นำเข้า proxy.imp.imp.imamalinterface; @runwith เป็นโมฆะหลัก (สตริง [] args) {AnimalInterface dog = imantfactory.getanimal (dogimp.class, aopmethod ใหม่ () {// นี่คือวิธีการตัด AOP ก่อนที่วิธีการดำเนินการโมฆะสาธารณะก่อน (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) {system.err.println ( วิธีการตัดหลังจากวิธีการเรียกใช้โมฆะสาธารณะหลังจาก (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) {system.err.println ("ฉันอยู่ใน" + method.getName () + "ดำเนินการหลังจากวิธีการดำเนินการ"); Dog.Say (); สตริงชื่อ 1 = "ชื่อของฉันคือ" + dog.getName (); System.out.println (ชื่อ 1); dog.setName ("ergouzi"); สตริงชื่อ 2 = "ชื่อของฉันคือ"+dog.getName (); System.out.println (name2); - ฮูฮูที่รักคุณรู้สึกอยากฉีดไหม? คุณรู้สึกว่าคุณได้ตัดวิธีของตัวเองลงไปหรือไม่ ??? ฮ่าฮ่า…
ดูเหมือนว่าทุกอย่างจะสมบูรณ์แบบ แต่ฉันมักจะรู้สึกว่ามีบางอย่างขาดหายไป? โอ้ใช่ไม่มีไฟล์การกำหนดค่าเช่นฤดูใบไม้ผลิ
อันที่จริงแล้วมันง่ายมากอยู่แล้ว ปล่อยให้พวกเขามาหาคุณ เพียงแค่ออกแบบรูปแบบ XML และรอคุณจะพูดอะไร? คุณไม่สามารถสกัดกั้นวิธีการที่กำหนดเองได้หรือไม่?
ไม่สามารถสกัดกั้นวิธีการที่กำหนดเองเช่นฤดูใบไม้ผลิได้หรือไม่? โอ้ ~~ ไม่จริงคุณสามารถใช้วิธีการและเมธอดในการตัดสินก่อนหน้า (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) เพื่อใช้วิธีการและให้เมธอด
แน่นอนว่าตัวอย่างนี้ไม่มีความสำคัญในทางปฏิบัติและไม่สามารถเปรียบเทียบกับเฟรมเวิร์ก AOP ที่สมบูรณ์แบบได้ บทความนี้ให้วิธีคิดคุณเท่านั้น แต่คุณต้องจำไว้ว่าไม่ว่าสิ่งต่าง ๆ จะยอดเยี่ยมแค่ไหนพวกเขาจะสะสมทีละนิด
ตัวอย่างดาวน์โหลด: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น