JDK动态代理和Cglib的动态代理
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的动态代理相关推荐
- jdk中的动态代理和cglib中动态代理的区别
jdk中动态代理: 要求目标对象必须实现了某个接口. 代理对象和目标对象要想实现相同的功能,在底层的表现是代理对象和目标对象实现了相同的接口,因此获取代理对象后(Object类型),应该向下转型为目标 ...
- Java动态代理和Cglib动态代理最强王者阵容
Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨黎杜 来源丨非科班的科班(LDCldc1230 ...
- jdk动态代理和cglib动态代理的区别
一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...
- jdk动态代理和cglib动态代理实现及区别
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...
最新文章
- OpenAI推出数学推理证明模型,推理结果首次被数学家接受
- linux 内核中断与时钟的冲突 问题 del_timer,Linux内核开发之中断与时钟(三)
- SVM的发展和研究热点
- 如何提升springboot服务吞吐量
- 计算机专业可以评机械工程师,机械工程师个人评价
- mysql 传统数据恢复_mysql 数据恢复实例
- C++实现 逆波兰表达式计算问题
- 估算CSDN约有340万用户开通了博客
- APUE学习笔记-15章进程间通信
- eclipse配色方案
- 换新电脑后怎么重装系统win7,win7安装教程
- 【疯狂诗词大会小程序2.0】功能模块+前端+诗词答题小程序+内置数千道题目+开箱即用
- 【ZCMU1600】卡斯丁狗要吃糖葫芦
- 如何在Joomla中创建一个漂亮的单页网站
- 最全面的Android工程师知识图谱推荐
- can 串口 can 232 can 485 串口转CANbus总线网关模块CAN232/485MB转换器CANCOM
- X-CUBE-USB-AUDIO 资料篇②——AUD_Streaming10 USB音频设备扩展应用
- 部署在云平台和IDC机房的系统也要过等保吗?
- ES索引以及映射关系的创建,查询,删除。
- DG232RL与FT232RL/GP232RL区别开发
热门文章
- nodejs运行python_如何在后台Python中运行子进程命令来启动nodejs服务器
- Java项目:仿小米商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
- c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...
- python是一种面向对象的高级语言_爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?...
- Swing 实现聊天系统 私发与群发
- vue中点击第一次没有触发按钮怎么操作_vue如何触发某个元素的单击事件?
- python3.9.0 print_关于 Python 3.9,那些你不知道的事
- pytorch 测试每一类_DeepFM全方面解析(附pytorch源码)
- python中集合的元素可以是任意数据类型_Python之基本数据类型——集合数据类型...
- 智销功能_Shiro权限框架