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引入增强相关推荐

  1. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  2. aop实现原理-动态代理CGLib代理

    那接下来的话,那咱们Spring当中,这个AOP,咱们先说概念,咱们先不写具体代码,咱们就是聊,聊Spring的AOP,Spring能帮我们干啥呢,我告诉你,Spring他作为对象的容器,Spring ...

  3. Proxy 代理模式 动态代理 CGLIB

    代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...

  4. 动态代理--cglib

    2019独角兽企业重金招聘Python工程师标准>>> 1.具体实现类,没有实现接口 package com.lx.proxy;public class Student {publi ...

  5. java jdk动态代理 cglib动态代理demo

    最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...

  6. 静态代理,动态代理,Cglib代理详解

    一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc;public interface Iplayer { public voi ...

  7. 动态代理——CGLIB动态代理原理示例解析

    觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...

  8. cglib 动态代理和 jkd 动态代理

    例子:买电脑 背景:在早年间,假如你要买台电脑你得去联系电脑生产厂商购买,随着业务规模的增加,生产的电脑越来越多,当然买的人也多,这时候对于厂家来说相关的运营成本(仓储成本.物流成本.售后服务-)也随 ...

  9. 一文理解JDK静态代理、JDK动态代理、Cglib动态代理

    代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...

最新文章

  1. CVPR2020:三维实例分割与目标检测
  2. Specification使用in
  3. JQuery轻量级网页编辑器 选中即可编辑
  4. ubuntu 安装 spconv
  5. 从RedisTemplate中获得Jedis实例
  6. java 反射类成员_java 反射(二)类成员
  7. 自适应网页设计(转)
  8. 布局时margin会影响父元素
  9. java delphi aes加密算法_AES加密算法(Delphi源码)
  10. 【渝粤题库】陕西师范大学200941小学数学教学论 作业(高起专)
  11. 链家重庆二手房爬取以及房价预测
  12. 农历阳历转换 java_Java编程实例:Java版农历和阳历转换源码
  13. 解决问题:cannot create symlink in “/etc/docker“: existing file in the way
  14. Android EventBus的实现原理
  15. Cisco Packet Tracer-物联网实验
  16. 关于img标签的src的绝对路径问题
  17. 基于 Wio Terminal 实现的网络天气预报助理
  18. kinect fusion 3D扫描
  19. 等级保护与分级保护关系与区别
  20. darwin之一万个定时器实现(IdleTask)

热门文章

  1. 【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真
  2. [JS] Invalid Date
  3. PhpStorm配置Xdebug调试PHP程序
  4. 在Linux下编写C程序,怎么检查程序是否有内存泄漏?
  5. Mac 下隐藏显示隐藏文件
  6. uniapp使用iconfont字体图标
  7. [react] contextType是什么?它有什么用?
  8. Taro+react开发(85):taro路由参数
  9. 前端学习(3026):vue+element今日头条管理-调整外观
  10. [js] 模拟 localStorage 时如何实现过期时间功能