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可以代理没有实现接口的目标对象。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子老长鼻屎要怎么办 眼睛老有眼屎是怎么办 眼睛有干眼屎是怎么办 小孩流黄鼻涕是怎么办 孕妇9个月流鼻涕怎么办 流黄鼻涕两周了怎么办 大人流黄脓鼻涕怎么办 鼻子一直流鼻涕像水一样怎么办 6个月婴儿流鼻涕怎么办 9个月婴儿流鼻涕怎么办 狗狗晕车吐了怎么办 小狗又拉又吐怎么办 犬瘟热流黄鼻涕怎么办 2个月幼犬流鼻涕怎么办 5个月宝宝流鼻血怎么办 1岁宝宝感冒鼻塞怎么办 4个月宝宝鼻塞怎么办 4岁宝宝感冒鼻塞怎么办 宝宝4个月流鼻涕怎么办 3个月的宝宝鼻塞怎么办 50天的小孩鼻塞怎么办 鼻子流脓鼻涕2周怎么办 两岁宝宝流清鼻涕怎么办 1岁宝宝流黄鼻涕怎么办 宝宝上火流黄鼻涕怎么办 一周岁宝宝流清鼻涕怎么办 一周岁流清鼻涕怎么办 4岁宝宝感冒发烧怎么办 6个月宝宝流鼻涕怎么办 8岁儿童感冒发烧怎么办 婴儿感冒咳嗽怎么办%3f 小孩流鼻涕鼻塞怎么办最简单方法 宝宝鼻炎鼻子不通气怎么办 小孩晚上睡觉鼻子不通气怎么办 孩子晚上睡觉鼻子不通气怎么办 3个月婴儿流鼻涕怎么办 一个月宝宝鼻塞流鼻涕怎么办 我的鼻子不通气怎么办 鼻子擦多了疼怎么办 鼻涕擦多了好疼怎么办 鼻炎一直流鼻水怎么办