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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

代理学习

發布時間:2024/9/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代理学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代理學習

1、靜態代理

測試類:

package com.example.demo.proxy;public class StaticProxy implements UserDao {private UserDao userdao;public UserDao getUserdao() {return userdao;}public void setUserdao(UserDao userdao) {this.userdao = userdao;}@Overridepublic void getUser() {System.out.println("代理類進入");userdao.getUser();System.out.println("代理類退出");}public static void main(String[] args) {StaticProxy sp = new StaticProxy();UserDao userDao = new UserDaoImpl();sp.setUserdao(userDao);sp.getUser();} }

userdao:

package com.example.demo.proxy;public interface UserDao {void getUser(); }

userdaoimpl:

package com.example.demo.proxy;public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("userdao impl");} }

運行測試類:

代理類進入 userdao impl 代理類退出

?

2、jdk動態代理
測試類:

package com.example.demo.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class DynamicProxy1 {//維護一個被代理的類private Object obj;public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}public Object getInstance() {return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("進入proxy");//invoke兩個參數,obj原對象,args參數method.invoke(obj, args);System.out.println("退出proxy");return null;}});}public static void main(String[] args) {DynamicProxy1 dp1 = new DynamicProxy1();dp1.setObj(new UserDaoImpl());UserDao instance = (UserDao) dp1.getInstance();instance.getUser();} }

userdao和userdaoimpl同上

運行測試類:

進入proxy userdao impl 退出proxy

JDK動態代理局限性

通過反射類Proxy和InvocationHandler回調接口實現的jdk動態代理,要求委托類必須實現一個接口,但事實上并不是所有類都有接口,對于沒有實現接口的類,便無法使用該方方式實現動態代理。

3、cglib動態代理

靜態代理和jdk動態代理模式都是要求目標對象實現一個接口,
Cglib代理,也叫作子類代理,是基于asm框架,實現了無反射機制進行代理,利用空間來換取了時間,代理效率高于jdk ,它是在內存中構建一個子類對象從而實現對目標對象功能的擴展.
它有如下特點: JDK的動態代理有一個限制,就是使用動態代理的對象必須實現一個或多個接口,如果想代理沒有實現接口的類,就可以使用Cglib實現.
Cglib是一個強大的高性能的代碼生成包,它可以在運行期擴展java類與實現java接口.它廣泛的被許多AOP的框架使用,例如Spring AOP和synaop,為他們提供方法的interception(攔截)
Cglib包的底層是通過使用一個小而塊的字節碼處理框架ASM來轉換字節碼并生成新的類.不鼓勵直接使用ASM,因為它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉. 注意
需要引入cglib的jar文件,但是Spring的核心包中已經包括了Cglib功能,所以直接引入pring-core-3.2.5.jar即可.
引入功能包后,就可以在內存中動態構建子類
代理的類不能為final,否則報錯
目標對象的方法如果為final/static,那么就不會被攔截,即不會執行目標對象額外的業務方法. 測試類: package com.example.demo.proxy;import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** 實現methodInterceptor方法,并重寫interceptor方法*/ public class CglibDynamicProxy implements MethodInterceptor {//維護一個被代理的對象private Object target;public Object getinstance() {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());//回調方法指定當前類即可(實現了methodInterceptor接口的類)enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("cglib代理開始");Object invoke = method.invoke(target, objects);System.out.println("cglib代理結束");return invoke;}public static void main(String[] args) {CglibDynamicProxy cg = new CglibDynamicProxy();UserWithoutInterface u = new UserWithoutInterface();cg.setTarget(u);UserWithoutInterface instance = (UserWithoutInterface) cg.getinstance();instance.getuser();}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;} }

被代理對象UserwithoutInterface:

package com.example.demo.proxy;public class UserWithoutInterface {public void getuser(){System.out.println("執行userwithoutInterface中的getuser方法");} }

執行測試類結果:

cglib代理開始 執行userwithoutInterface中的getuser方法 cglib代理結束

?

?

參考:http://ifeve.com/java-reflection-11-dynamic-proxies/

?

posted @ 2019-06-13 21:49 巡山小妖N 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的代理学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。