麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

java動態代理

2019-11-06 06:11:29
字體:
來源:轉載
供稿:網友

java動態代理

參考Java動態代理機制詳解(JDK 和CGLIB,Javassist,ASM)

代理的實質是在運行期間手動創建class類,對被代理對象的方法進行代理,調用被代理對象的方法,動態代理就是動態的創建PRoxy對象,用完之后銷毀class類,避免冗雜,動態代理的實現方式主要有以下兩種。
一、通過jdk實現InvocationHandler實現動態代理
1、定義接口
package cn.zlz.proxy.jdk;public interface IComputorService { /** * 賣電腦 * @param brand */ public void sellComputor(String brand); /** * 修電腦 */ public void repairComputor(String brand);}
2、定義接口實現類
package cn.zlz.proxy.jdk;public class ThinkPadSeller implements IComputorService{ public void sellComputor(String brand) { System.out.println("sell the thinkPad computor"); } public void repairComputor(String brand) { System.out.println("repair the thinkPad computor"); }}
3、定義生成代理對象
package cn.zlz.proxy.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class SimpleProxyImpl implements InvocationHandler { // 被代理對象 private ThinkPadSeller thinkPadSeller; public SimpleProxyImpl(ThinkPadSeller thinkPadSeller) { super(); this.thinkPadSeller = thinkPadSeller; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理開始"); // 調用被代理對象 method.invoke(thinkPadSeller, args); System.out.println("代理結束"); return null; } //提供方法獲取代理對象 public IComputorService newProxy(){ //使用Proxy類創建代理對象 IComputorService proxyInstance = (IComputorService) Proxy.newProxyInstance(thinkPadSeller.getClass().getClassLoader(), //使用被代理對象的加載器 thinkPadSeller.getClass().getInterfaces(), //使用被代理對象的接口 this );//匿名內部類比較坑,所以我們找一個類實現并覆寫方法,直接用本類,現成的.. return proxyInstance; } }
4、main函數測試
package cn.zlz.proxy.jdk;import java.lang.reflect.Proxy;/** * 通過jdk的實現invocationHandler接口只能代理實現接口的對象 * 為了解決這個問題,就有了動態地創建Proxy的想法:在運行狀態中,需要代理的地方,根據接口 和被代理對象, * 動態地創建一個Proxy,用完之后,就會銷毀,這樣就可以避免了Proxy 角色的class在系統中冗雜的問題了。 * */public class Main { public static void main(String[] args) { /** * 使用Proxy創建代理對象 * 1、被代理對象 * 2、被代理對象實現的接口s * 3、Invocation實現對象 */ //使用Proxy類創建代理對象 Class beProxyClazz = ThinkPadSeller.class; ThinkPadSeller thinkPadSeller = new ThinkPadSeller(); ClassLoader classLoader = beProxyClazz.getClassLoader(); Class[] interfaces = beProxyClazz.getInterfaces(); SimpleProxyImpl simpleProxyImpl = new SimpleProxyImpl(thinkPadSeller); // 根據上面提供的信息,創建代理對象 在這個過程中,JDK會通過根據傳入的參數信息動態地在內存中創建和.class 文件等同的字節碼 ,然后根據相應的字節碼轉換成對應的class,然后調用newInstance()創建實例 IComputorService proxy = (IComputorService) Proxy.newProxyInstance(classLoader, interfaces, simpleProxyImpl); /* * 生成的代理對象編譯后的代碼為 public final repairComputor(){this.h.invoke(this, m3, null);m3 = Class.forName("cn.zlz.proxy.jdk.ThinkPadSeller").getMethod("repairComputor", [String.class]); } * this指的是invocation的實現類,調用invoke方法,并將被代理對象的方法作為參數傳遞 */ proxy.repairComputor("thinkPad"); }}
而、通過cglib實現動態代理
1、定義被代理對象
package cn.zlz.proxy.cglib;public class ThinkPadSeller { public void sellComputor(String brand) { System.out.println("sell the thinkPad computor"); } public void repairComputor(String brand) { System.out.println("repair the thinkPad computor"); }}
2、實現cglib的MethodInterceptor
package cn.zlz.proxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/* * cglib代理,實現MethodInterceptor */public class CglibProxy implements MethodInterceptor { 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; }}
3、main函數調試
package cn.zlz.proxy.cglib;import net.sf.cglib.proxy.Enhancer;/* * 代理對象繼承被代理對象 1.查找被代理類的所有非final 的public類型的方法定義; 2.將這些方法的定義轉換成字節碼; 3.將組成的字節碼轉換成相應的代理的class對象; 4.實現 MethodInterceptor接口,用來處理 對代理類上所有方法的請求(這個接口和JDK動態代理InvocationHandler的功能和角色是一樣的) */public class Main { public static void main(String[] args) { CglibProxy cglibProxy = new CglibProxy(); // cglib 中加強器,用來創建動態代理 Enhancer enhancer = new Enhancer(); // 設置要創建動態代理的類,即父類 enhancer.setSuperclass(ThinkPadSeller.class); // 設置回調,這里相當于是對于代理類上所有方法的調用,都會調用CallBack,而Callback則需要實行intercept()方法進行攔截 enhancer.setCallback(cglibProxy); ThinkPadSeller proxy = (ThinkPadSeller) enhancer.create(); proxy.repairComputor("thinkpad"); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美18—19sex性护士中国 | 青草av.久久免费一区 | 国产精品久久久久无码av | 国产一级性生活视频 | 国产精品免费久久久久久 | 精品国产专区 | 爱草成年| av成人在线免费观看 | 91嫩草丨国产丨精品入口 | 中文字幕在线免费播放 | 日本在线一区二区 | 欧美成人高清视频 | 欧美乱淫| 91综合在线观看 | 国产成人高潮免费观看精品 | 美国一级黄色毛片 | 黄色片网站免费 | 成人午夜天堂 | 天堂成人国产精品一区 | 狠狠干五月天 | 国产69精品久久久久99尤 | 亚洲不卡| 中文区永久区 | 欧美在线观看视频一区 | 中国妞xxxhd露脸偷拍视频 | 国产精品视频一区二区三区四区五区 | 毛片免费视频播放 | 请播放一级毛片 | 2021国产精品视频 | 欧美日韩亚洲成人 | 热久久91 | 欧美一级免费高清 | 男女视频免费看 | 久久在线精品视频 | 激情综合网俺也去 | 亚洲国产精品久久久久 | av电影免费在线看 | 欧美视频在线观看一区 | 黄色片免费在线 | 999精品久久久| 久久精品网 |