03、动态代理--CGLib引入增强
生活随笔
收集整理的這篇文章主要介紹了
03、动态代理--CGLib引入增强
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.offer.note.Java基礎.動態代理.CGLib引入增強;public interface Browser {void visitInternet();
}
?
package com.offer.note.Java基礎.動態代理.CGLib引入增強;/*** 目標類:被代理類** @author: xueguanfeng* @date: 2018-05-15 09:57*/ public class ChromeBrowser implements Browser {@Overridepublic void visitInternet() {System.out.println("visit YouTube");}//非接口方法public void listenToMusic() {System.out.println("listen to Cranberries");} }?
package com.offer.note.Java基礎.動態代理.CGLib引入增強;import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** CGLib引入增強** @author: xueguanfeng* @date: 2018-05-15 13:08*/ public class CglibIntroductionBrowserProxy implements MethodInterceptor, Game {private static CglibIntroductionBrowserProxy proxy = new CglibIntroductionBrowserProxy();private CglibIntroductionBrowserProxy() {}public static CglibIntroductionBrowserProxy getInstance() {return proxy;}public <T> T getProxy(Class<T> clazz) {//第二個入參:指定產生的代理類實現的接口,指定的接口中的方法,需要通過反射來調用,不能通過CGLib來觸發調用return (T) Enhancer.create(clazz, new Class[]{Game.class}, this);}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {Object retVal;//判斷執行方法是否為指定代理類實現的接口中的方法,如果是,則通過“反射”調用接口的實現類。if (method.getDeclaringClass().isInterface()) {method.setAccessible(true);System.out.println("=================通過反射調用目標方法===================");encrypt();retVal = method.invoke(this, args);decrypt();//如果不是,則通過CGLib來觸發。} else {System.out.println("=================CGLib觸發目標方法調用===================");encrypt();retVal = proxy.invokeSuper(obj, args);decrypt();}return retVal;}@Overridepublic void start() {System.out.println("start a game");}增強////*** 加密*/private void encrypt() {System.out.println("encrypt ...");}/*** 解密*/private void decrypt() {System.out.println("decrypt ...");}}?
package com.offer.note.Java基礎.動態代理.CGLib引入增強;/*** 測試類** @author: xueguanfeng* @date: 2018-05-15 13:10*/ public class CglibIntroductionDynamicProxyTest {public static void main(String[] args) {//動態生成的代理類的實例ChromeBrowser browser = CglibIntroductionBrowserProxy.getInstance().getProxy(ChromeBrowser.class);browser.visitInternet();browser.listenToMusic();//動態生成的代理類實現了Game接口(return (T) Enhancer.create(clazz, new Class[]{Game.class}, this);)Game game = (Game) browser;game.start();} }?
轉載于:https://www.cnblogs.com/xueguanfeng/p/9042377.html
總結
以上是生活随笔為你收集整理的03、动态代理--CGLib引入增强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试时,如何巧妙回答跳槽问题
- 下一篇: mac下安装brew下载非常慢解决方法