2019独角兽企业重金招聘Python工程师标准>>>

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。

重点说一下JDK的动态代理和Cglib的动态代理吧

先说JDK的,需要被代理的类需要有接口,否则无法实现

package proxy.dynamic;public interface IBook {void add();
}

实现接口的类如下

package proxy.dynamic;public class Book implements IBook {@Overridepublic void add() {System.out.println("Add Method!");}}

创建一个代理类,需要实现一个接口InvocationHandler接口,里面有一个invoke方法需要实现

同时创建一个生成实例的方法

package proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class BookProxy implements InvocationHandler{private Object target;public Object bind(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);//这里需要接口}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result=null;System.out.println("Before");result=method.invoke(target, args);//执行方法System.out.println("After");return result;}}

接下来创建测试类

package proxy.dynamic;public class Test {/*** @param args*/public static void main(String[] args) {BookProxy bp = new BookProxy();IBook book = (IBook) bp.bind(new Book());book.add();}}

可以看到依次输出了Before,方法,After

下面说一下Cglib的代理,Cglib代理不需要原类实现接口,依赖Cglib和asm两个Jar包

需要代理的类如下

package cglib.proxy;public class Book {public void add() {System.out.println("Add Method!");}
}

创建一个代理类,实现MethodInterceptor接口,同时写一个生成实例的getInstance方法

package cglib.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{private Object target;public Object getInstance(Object target){this.target=target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("Before");proxy.invokeSuper(obj, args);System.out.println("After");return null;}}

接下来就是简单测试一下

package cglib.proxy;public class Test {/*** @param args*/public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Book book=(Book) proxy.getInstance(new Book());book.add();}}

运行效果一样的

简单总结一下,JDK动态代理,需要实现一个接口InvocationHandler,要求被代理的对象必须有一个接口

Cglib代理需要实现MethodInterceptor接口,不需要被代理的类必须有接口

性能方法,参考其他文章,说JDK代理适合多例模式,而单例模式Cglib更好一些,因为Cglib是用底层的字节码技术生成实例,耗费时间较长,性能不如JDK动态代理。(有待验证。。)

转载于:https://my.oschina.net/eviltuzki/blog/523352

JDK动态代理和Cglib的动态代理相关推荐

  1. jdk中的动态代理和cglib中动态代理的区别

    jdk中动态代理: 要求目标对象必须实现了某个接口. 代理对象和目标对象要想实现相同的功能,在底层的表现是代理对象和目标对象实现了相同的接口,因此获取代理对象后(Object类型),应该向下转型为目标 ...

  2. Java动态代理和Cglib动态代理最强王者阵容

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨黎杜 来源丨非科班的科班(LDCldc1230 ...

  3. jdk动态代理和cglib动态代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  4. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  5. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  6. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

    大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...

  7. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  8. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  9. jdk动态代理和cglib动态代理实现及区别

    代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...

最新文章

  1. OpenAI推出数学推理证明模型,推理结果首次被数学家接受
  2. linux 内核中断与时钟的冲突 问题 del_timer,Linux内核开发之中断与时钟(三)
  3. SVM的发展和研究热点
  4. 如何提升springboot服务吞吐量
  5. 计算机专业可以评机械工程师,机械工程师个人评价
  6. mysql 传统数据恢复_mysql 数据恢复实例
  7. C++实现 逆波兰表达式计算问题
  8. 估算CSDN约有340万用户开通了博客
  9. APUE学习笔记-15章进程间通信
  10. eclipse配色方案
  11. 换新电脑后怎么重装系统win7,win7安装教程
  12. 【疯狂诗词大会小程序2.0】功能模块+前端+诗词答题小程序+内置数千道题目+开箱即用
  13. 【ZCMU1600】卡斯丁狗要吃糖葫芦
  14. 如何在Joomla中创建一个漂亮的单页网站
  15. 最全面的Android工程师知识图谱推荐
  16. can 串口 can 232 can 485 串口转CANbus总线网关模块CAN232/485MB转换器CANCOM
  17. X-CUBE-USB-AUDIO 资料篇②——AUD_Streaming10 USB音频设备扩展应用
  18. 部署在云平台和IDC机房的系统也要过等保吗?
  19. ES索引以及映射关系的创建,查询,删除。
  20. DG232RL与FT232RL/GP232RL区别开发

热门文章

  1. nodejs运行python_如何在后台Python中运行子进程命令来启动nodejs服务器
  2. Java项目:仿小米商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  3. c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...
  4. python是一种面向对象的高级语言_爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?...
  5. Swing 实现聊天系统 私发与群发
  6. vue中点击第一次没有触发按钮怎么操作_vue如何触发某个元素的单击事件?
  7. python3.9.0 print_关于 Python 3.9,那些你不知道的事
  8. pytorch 测试每一类_DeepFM全方面解析(附pytorch源码)
  9. python中集合的元素可以是任意数据类型_Python之基本数据类型——集合数据类型...
  10. 智销功能_Shiro权限框架