摘要:動(dòng)態(tài)代理模式動(dòng)態(tài)代理模式是一種第三方的動(dòng)態(tài)代理模式,我們?cè)谑褂眠@個(gè)代理模式的時(shí)候,需要導(dǎo)入三方包如下動(dòng)態(tài)代理模式不需要想動(dòng)態(tài)代理模式那樣使用接口,一個(gè)非抽象類就可以,但是前提是這個(gè)非抽象類需要實(shí)現(xiàn)接口,并重寫方法。
CGLIB動(dòng)態(tài)代理模式
CGLIB動(dòng)態(tài)代理模式 是一種第三方的動(dòng)態(tài)代理模式,我們?cè)谑褂眠@個(gè)代理模式的時(shí)候,需要導(dǎo)入三方j(luò)ar包,如下:
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar
cglib-nodep-2.1_3.jar
CGLIB動(dòng)態(tài)代理模式不需要想JDK動(dòng)態(tài)代理模式那樣使用接口,一個(gè)非抽象類就可以,但是前提是這個(gè)非抽象類需要實(shí)現(xiàn)MethodInterceptor接口,并重寫intercept方法。我們通過(guò)代碼來(lái)了解其實(shí)現(xiàn)原理。
//創(chuàng)建一個(gè)普通類 public class SayHello { public void say(String name) { System.out.println("您好," + name); } }
//CGLIB動(dòng)態(tài)代理類 public class CglibProxy implements MethodInterceptor { /** * 生成CGLIB代理對(duì)象 * @param cls -Class類 需要被代理的真實(shí)對(duì)象 * @return */ public Object getProxy(Class cls) { //1.CGLIB enhancer增強(qiáng)類對(duì)象 Enhancer en = new Enhancer(); //2.設(shè)置增強(qiáng)類型 en.setSuperclass(cls); //3.定義代理邏輯對(duì)象為當(dāng)前對(duì)象,要求當(dāng)前對(duì)象實(shí)現(xiàn) MethodInterceptor 接口 en.setCallback(this); //生成代理對(duì)象并返回 Object proxy = en.create(); return proxy; } /** * 代理邏輯方法 * 1.proxy 代理對(duì)象 * 2.method 方法 * 3.args 方法參數(shù) * 4.methodProxy 方法代理 */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("調(diào)用代理對(duì)象之前的邏輯~"); Object result = methodProxy.invokeSuper(proxy, args); System.out.println("調(diào)用代理對(duì)象之后的邏輯~"); return result; } }
//測(cè)試代碼 public class TestCglibProxy { public static void main(String[] args) { CglibProxy cglib = new CglibProxy(); SayHello proxy = (SayHello) cglib.getProxy(SayHello.class); proxy.say("James"); } }結(jié)果展示
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69601.html
摘要:下面我們通過(guò)玩英雄聯(lián)盟代練的例子來(lái)說(shuō)明下登錄游戲贏下了一局英雄聯(lián)盟,獲得了金幣測(cè)試結(jié)果登錄游戲贏下了一局英雄聯(lián)盟,獲得了金幣可以這樣理解,自己寫代理類的方式就是靜態(tài)代理。 前言 剛上大學(xué)那會(huì),英雄聯(lián)盟火的一塌糊涂,當(dāng)時(shí)每天都想著升到30級(jí)開(kāi)啟排位之旅。可是升到30級(jí)需要大把的時(shí)間不說(shuō),這時(shí)候匹配到的人,水平過(guò)于參差不齊,問(wèn)候你全家的事經(jīng)常發(fā)生,那個(gè)時(shí)候就想要是能有個(gè)代練幫我升到30級(jí)該...
摘要:代理模式代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過(guò)一個(gè)代理對(duì)象來(lái)操作這個(gè)實(shí)際的目標(biāo)對(duì)象。 代理模式: 代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過(guò)一個(gè)代理對(duì)象來(lái)操作這個(gè)實(shí)際的目標(biāo)對(duì)象。應(yīng)用場(chǎng)景一般是需要在執(zhí)行某個(gè)已經(jīng)寫好的方法前后再添加一段邏輯,比如執(zhí)行方法前打印日志,或者在執(zhí)行方法之前和之后打時(shí)...
摘要:與靜態(tài)代理對(duì)比,動(dòng)態(tài)代理是在動(dòng)態(tài)生成代理類,由代理類完成對(duì)具體方法的封裝,實(shí)現(xiàn)的功能。本文將分析中兩種動(dòng)態(tài)代理的實(shí)現(xiàn)方式,和,比較它們的異同。那如何動(dòng)態(tài)編譯呢你可以使用,這是一個(gè)封裝了的庫(kù),幫助你方便地實(shí)現(xiàn)動(dòng)態(tài)編譯源代碼。 發(fā)現(xiàn)Java面試很喜歡問(wèn)Spring AOP怎么實(shí)現(xiàn)的之類的問(wèn)題,所以寫一篇文章來(lái)整理一下。關(guān)于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實(shí)現(xiàn)方...
摘要:除了和外,我們還有最后一招我直接把一個(gè)代理類的源代碼用字符串拼出來(lái),然后基于這個(gè)字符串調(diào)用的編譯期,動(dòng)態(tài)的創(chuàng)建一個(gè)新的文件,然后動(dòng)態(tài)編譯這個(gè)文件,這樣也能得到一個(gè)新的代理類。 面試問(wèn)題:Java里的代理設(shè)計(jì)模式(Proxy Design Pattern)一共有幾種實(shí)現(xiàn)方式?這個(gè)題目很像孔乙己?jiǎn)栜钕愣沟能钭钟心膸追N寫法? showImg(https://segmentfault.com/...
摘要:代理模式的實(shí)現(xiàn)靜態(tài)代理優(yōu)缺點(diǎn)優(yōu)點(diǎn)只對(duì)對(duì)需要的方法加代理邏輯。通過(guò)繼承的方式進(jìn)行代理,無(wú)論目標(biāo)對(duì)象有沒(méi)有實(shí)現(xiàn)接口都可以代理,但是無(wú)法處理的情況。 注意:本文所有的class使用的static修飾主要是為了能在一個(gè)類里面測(cè)試。實(shí)際項(xiàng)目中不應(yīng)該這樣做的,應(yīng)該分包分class。文字描述不是很多,還是看代碼比較好理解吧... 1. Java代理的理解 代理模式是一種設(shè)計(jì)模式,簡(jiǎn)單說(shuō)即是在不改變?cè)?..
閱讀 2532·2021-10-11 10:59
閱讀 2712·2021-09-22 15:49
閱讀 2647·2021-08-13 13:25
閱讀 1290·2019-08-30 13:14
閱讀 2393·2019-08-29 18:45
閱讀 2999·2019-08-29 18:36
閱讀 1490·2019-08-29 13:21
閱讀 1163·2019-08-26 11:44