国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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"); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 工布江达县| 九寨沟县| 资兴市| 泰和县| 怀集县| 海南省| 瑞昌市| 疏附县| 武平县| 新安县| 舟山市| 霍城县| 新兴县| 准格尔旗| 布拖县| 洛南县| 龙江县| 仁布县| 昆山市| 临邑县| 宾川县| 交口县| 卓资县| 滦南县| 磐石市| 阿巴嘎旗| 尼木县| 湘潭市| 邮箱| 马龙县| 平乐县| 三江| 桐城市| 阳谷县| 天峻县| 闵行区| 盐源县| 即墨市| 沂南县| 昌平区| 盱眙县|