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引入增强相关推荐
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- aop实现原理-动态代理CGLib代理
那接下来的话,那咱们Spring当中,这个AOP,咱们先说概念,咱们先不写具体代码,咱们就是聊,聊Spring的AOP,Spring能帮我们干啥呢,我告诉你,Spring他作为对象的容器,Spring ...
- Proxy 代理模式 动态代理 CGLIB
代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...
- 动态代理--cglib
2019独角兽企业重金招聘Python工程师标准>>> 1.具体实现类,没有实现接口 package com.lx.proxy;public class Student {publi ...
- java jdk动态代理 cglib动态代理demo
最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...
- 静态代理,动态代理,Cglib代理详解
一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc;public interface Iplayer { public voi ...
- 动态代理——CGLIB动态代理原理示例解析
觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...
- cglib 动态代理和 jkd 动态代理
例子:买电脑 背景:在早年间,假如你要买台电脑你得去联系电脑生产厂商购买,随着业务规模的增加,生产的电脑越来越多,当然买的人也多,这时候对于厂家来说相关的运营成本(仓储成本.物流成本.售后服务-)也随 ...
- 一文理解JDK静态代理、JDK动态代理、Cglib动态代理
代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...
最新文章
- CVPR2020:三维实例分割与目标检测
- Specification使用in
- JQuery轻量级网页编辑器 选中即可编辑
- ubuntu 安装 spconv
- 从RedisTemplate中获得Jedis实例
- java 反射类成员_java 反射(二)类成员
- 自适应网页设计(转)
- 布局时margin会影响父元素
- java delphi aes加密算法_AES加密算法(Delphi源码)
- 【渝粤题库】陕西师范大学200941小学数学教学论 作业(高起专)
- 链家重庆二手房爬取以及房价预测
- 农历阳历转换 java_Java编程实例:Java版农历和阳历转换源码
- 解决问题:cannot create symlink in “/etc/docker“: existing file in the way
- Android EventBus的实现原理
- Cisco Packet Tracer-物联网实验
- 关于img标签的src的绝对路径问题
- 基于 Wio Terminal 实现的网络天气预报助理
- kinect fusion 3D扫描
- 等级保护与分级保护关系与区别
- darwin之一万个定时器实现(IdleTask)
热门文章
- 【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真
- [JS] Invalid Date
- PhpStorm配置Xdebug调试PHP程序
- 在Linux下编写C程序,怎么检查程序是否有内存泄漏?
- Mac 下隐藏显示隐藏文件
- uniapp使用iconfont字体图标
- [react] contextType是什么?它有什么用?
- Taro+react开发(85):taro路由参数
- 前端学习(3026):vue+element今日头条管理-调整外观
- [js] 模拟 localStorage 时如何实现过期时间功能