日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

代理模式 、JDK动态代理、cglib动态代理

發(fā)布時間:2024/4/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代理模式 、JDK动态代理、cglib动态代理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什么呢? 因為你對該地區(qū)房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。 再如我們有的時候打官司,我們需要請律師,因為律師在法律方面有專長,可以替我們進行操作,表達我們的 想法。public interface Sourceable { public void method(); } public?class?Source?implements?Sourceable?{??@Override??public?void?method()?{??System.out.println("the?original?method!");??}?? } ?public?class?Proxy?implements?Sourceable?{??private?Source?source;??public?Proxy(){??super();??this.source?=?new?Source();??}??@Override??public?void?method()?{??before();??source.method();??atfer();??}??private?void?atfer()?{??System.out.println("after?proxy!");??}??private?void?before()?{??System.out.println("before?proxy!");??}?? }public?class?ProxyTest?{??public?static?void?main(String[]?args)?{??Sourceable?source?=?new?Proxy();??source.method();??}??} ?輸出:before proxy! the original method! after proxy! 代理模式的應用場景: 如果已有的方法在使用的時候需要對原有的方法進行改進,此時有兩種辦法: 1、修改原有的方法來適應。這樣違反了“對擴展開放,對修改關閉”的原則。 2、就是采用一個代理類調(diào)用原有的方法,且對產(chǎn)生的結果進行控制。這種方法就是代理模式。 使用代理模式,可以將功能劃分的更加清晰,有助于后期維護!jdk動態(tài)代理 特點:只能對實現(xiàn)了接口的類生產(chǎn)代理,不能針對類定義接口 /**?*?創(chuàng)建業(yè)務接口,包含業(yè)務可以提供對外的接口?*?*/?? public?interface?UserService{??/**?*?目標方法??*/??public?void?add();?? }??定義實現(xiàn)類 /**?*?創(chuàng)建業(yè)務接口實現(xiàn)類?*?*/?? public?class?UserServiceImpl?implements?UserService{??@Override??public?void?add()?{??System.out.println("----------add----------");??}?? }?定義代理 /**?*?自定義簡單的Invocation,對接口提供的方法進行增強?*??*?@author?Fighter?*?@date?2016-04-19?*/?? public?class?MyInvocationHandler?implements?InvocationHandler?{??//目標對象 private Object target; /**?*?構造方法?*?@param?target?目標對象?*/??public?MyInvocationHandler(Object?target)?{??super();??this.target=target;??}??*?執(zhí)行目標對象的方法??*/??public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)??throws?Throwable?{??//在目標方法執(zhí)行前簡單打印一下??System.out.println("----------before----------");??//執(zhí)行目標方法對象??Object?result=method.invoke(target,?args);??//在目標方法執(zhí)行之后簡單打印一下??System.out.println("----------after----------");??return?result;??}??/**?*?獲取目標對象的代理對象?*?@return?代理對象?*?this.target.getClass().getInterfaces()//獲取被代理對象實現(xiàn)的所有接口*/??public?Object?getProxy(){??return?Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),???this.target.getClass().getInterfaces(),this);??}??}jdk動態(tài)代理測試public?class?ProxyTest{??@Test??public?void?testProxy()?throws?Throwable{??//實例化目標對象??UserService?userService=new?UserServiceImpl();??//實例化Invocation??MyInvocationHandler?invocationHandler=new?MyInvocationHandler(userService);??//根據(jù)目標生成代理對象??UserService?proxy=(UserService)invocationHandler.getProxy();??//調(diào)用代理對象方法??proxy.add();??}?? }?CGLIB動態(tài)代理示例 DK的動態(tài)代理機制只能代理實現(xiàn)了接口的類,而不能實現(xiàn)接口的類就不能實現(xiàn)JDK的動態(tài)代理,cglib是針對 類來實現(xiàn)代理的,他的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現(xiàn)增強,但因為采用的是 繼承,所以不能對final修飾的類進行代理。?CGLIB是一個強大的高性能的代碼生成包。定義實現(xiàn)類 /**??*?這個是沒有實現(xiàn)接口的實現(xiàn)類???*???*/???? public?class?BookFacadeImpl?{????public?void?addBook()?{????System.out.println("增加圖書的普通方法...");????}???? }??/**??*?使用cglib動態(tài)代理??*???*/???? public?class?BookFacadeCglib?implements?MethodInterceptor?{????private?Object?target;????/**??*?創(chuàng)建代理對象??*???*?@param?target??*?@return??*/????public?Object?getInstance(Object?target)?{????this.target?=?target;????Enhancer?enhancer?=?new?Enhancer();????enhancer.setSuperclass(this.target.getClass());????//?回調(diào)方法????enhancer.setCallback(this);????//?創(chuàng)建代理對象????return?enhancer.create();????}????@Override????//?回調(diào)方法????public?Object?intercept(Object?obj,?Method?method,?Object[]?args,????MethodProxy?proxy)?throws?Throwable?{????System.out.println("事物開始");????proxy.invokeSuper(obj,?args);????System.out.println("事物結束");????return?null;????}????}?public?class?TestCglib?{????public?static?void?main(String[]?args)?{????BookFacadeCglib?cglib=new?BookFacadeCglib();????BookFacadeImpl?bookCglib=(BookFacadeImpl)cglib.getInstance(new?BookFacadeImpl());????bookCglib.addBook();????}???? }總結 CGLib創(chuàng)建的動態(tài)代理對象性能比JDK創(chuàng)建的動態(tài)代理對象的性能高不少,但是CGLib在創(chuàng)建代理對象時所 花費的時間卻比JDK多得多,所以對于單例的對象,因為無需頻繁創(chuàng)建對象,用CGLib合適,反之,使用JDK 方式要更為合適一些。同時,由于CGLib由于是采用動態(tài)創(chuàng)建子類的方法,對于final方法,無法進行代理。

?

總結

以上是生活随笔為你收集整理的代理模式 、JDK动态代理、cglib动态代理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。