Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
来源:互联网 发布:男士帽子品牌知乎 编辑:程序博客网 时间:2024/06/06 15:45
一、动态代理
这里再简单总结一下
什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。
静态代理是在程序发布之前,我们就必须写好代理类的
动态代理在程序发布之前,并没有写好代理类,而是发布之后,动态创建代理对象的
这篇文章主要介绍两种动态代理,jdk代理和cglib代理
二、jdk代理
1、实现
通过实现 InvocationHandler 接口创建自己的调用处理器
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类
通过反射机制获得动态代理类的构造函数
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
2、代码
Sale saleProxy=(Sale)Proxy.newProxyInstance( jiajun.getClass.getClassLoader, jiajun.getClass.getInterfaces, new InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("===before==="); Object obj = method.invoke(jiajun, args); System.out.println("===after==="); return obj; } }); saleProxy.sale; saleProxy.rent;
3、原理
生成一个代理类,这个代理类继承Proxy类并且实现了我们定义的接口,代理对象调用方法的时候,调用这个代理对象的一个成员InvocationHandler(上面我们传入了一个InvocationHandler实现对象)的方法,也就是我们添加了before和after后的方法。
三、cglib代理
1、实现
实现CGLib包提供的MethodInterceptor接口,实现intercept方法,用CGLib中的Enhancer的creat方法创建代理对象
2、代码
class CGLibProxy implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { System.out.println("Before:" + method); Object object = proxy.invokeSuper(obj, arg); System.out.println("After:" + method); return object; } } public class Test2 { public static void main(String[] args) { CGLibProxy cgLibProxy=new CGLibProxy; Jiajun jiajunProxy=(Jiajun)Enhancer.create(Jiajun.class,cgLibProxy); jiajunProxy.buy; jiajunProxy.sale; } }
3、原理
通过asm字节码生成框架生成代理类Class的二进制字节码
通过Class.forName加载二进制字节码,生成Class对象
通过反射机制获取实例构造,并初始化代理类对象
四、jdk代理 vs cglib代理
jdk代理只能代理接口,不能代理没有接口的类。cglib代理可以代理没有接口的类
五、总结
动态代理相对于静态代理更加灵活,减少了代码量也提高了可维护性。
动态代理有两种,一种是jdk代理,通过创建一个继承Proxy类并实现接口的代理对象。一种是cglib代理,通过asm生成代理类class的字节码,再生成Class对象,最后通过反射创建代理对象。
jdk代理只适合基于接口的代理,cglib可以代理没有实现接口的目标对象。
这里再简单总结一下
什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。
静态代理是在程序发布之前,我们就必须写好代理类的
动态代理在程序发布之前,并没有写好代理类,而是发布之后,动态创建代理对象的
这篇文章主要介绍两种动态代理,jdk代理和cglib代理
二、jdk代理
1、实现
通过实现 InvocationHandler 接口创建自己的调用处理器
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类
通过反射机制获得动态代理类的构造函数
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
2、代码
Sale saleProxy=(Sale)Proxy.newProxyInstance( jiajun.getClass.getClassLoader, jiajun.getClass.getInterfaces, new InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("===before==="); Object obj = method.invoke(jiajun, args); System.out.println("===after==="); return obj; } }); saleProxy.sale; saleProxy.rent;
3、原理
生成一个代理类,这个代理类继承Proxy类并且实现了我们定义的接口,代理对象调用方法的时候,调用这个代理对象的一个成员InvocationHandler(上面我们传入了一个InvocationHandler实现对象)的方法,也就是我们添加了before和after后的方法。
三、cglib代理
1、实现
实现CGLib包提供的MethodInterceptor接口,实现intercept方法,用CGLib中的Enhancer的creat方法创建代理对象
2、代码
class CGLibProxy implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { System.out.println("Before:" + method); Object object = proxy.invokeSuper(obj, arg); System.out.println("After:" + method); return object; } } public class Test2 { public static void main(String[] args) { CGLibProxy cgLibProxy=new CGLibProxy; Jiajun jiajunProxy=(Jiajun)Enhancer.create(Jiajun.class,cgLibProxy); jiajunProxy.buy; jiajunProxy.sale; } }
3、原理
通过asm字节码生成框架生成代理类Class的二进制字节码
通过Class.forName加载二进制字节码,生成Class对象
通过反射机制获取实例构造,并初始化代理类对象
四、jdk代理 vs cglib代理
jdk代理只能代理接口,不能代理没有接口的类。cglib代理可以代理没有接口的类
五、总结
动态代理相对于静态代理更加灵活,减少了代码量也提高了可维护性。
动态代理有两种,一种是jdk代理,通过创建一个继承Proxy类并实现接口的代理对象。一种是cglib代理,通过asm生成代理类class的字节码,再生成Class对象,最后通过反射创建代理对象。
jdk代理只适合基于接口的代理,cglib可以代理没有实现接口的目标对象。
阅读全文
0 0
- Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
- jdk动态代理和cglib代理总结
- Java代理(jdk静态代理、动态代理和cglib动态代理)实例及总结
- JDK动态 代理 & CgLib 学习总结
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- jdk动态代理和cglib代理demo及总结
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- 百练_2694逆波兰表达式
- Codeforces Round #423 (Div. 2) E. DNA Evolution(树状数组)
- 公共子序列1007
- 79. Word Search
- 【算法概论习题】8.8解答
- Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
- Mac开启NTFS挂载功能
- Windows 10 将 Ubuntu作为它的APP
- LeetCode
- Java nio一个简单例子和画出之间通讯简图
- Android侧滑控件DrawableLayout以及NavigationView的使用
- spring
- Ubuntu下的提示信息彩色显示
- Gson解析Json数据