JDK动态 代理 & CgLib 学习总结

今天闲来无事,研究了一下JDK动态代理和CgLib,现总结如下:

一、JDK动态代理机制

JDK主要会做以下工作:

我们查看底层代码实现获悉如下

1、获取target object上所有的接口列表

2、确定要生成的代理类的类名,默认为:com.sun.proxy.$ProxyXXXX
3、根据需要实现的接口信息,在代码中动态创建该Proxy类的字节码
4、将对应的字节码转换为对应的class对象
5、创建InvocationHandler实例handler,用来拦截处理Proxy所有方法的调用
6、Proxy的class对象以创建的handler对象为参数,实例化一个proxy对象。

JDK通过 java.lang.reflect.Proxy包来支持动态代理,一般情况下,我们使用下面的newProxyInstance方法,在调用代理对象中的每一个方法时,在代码内部,都是直接调用了InvocationHandler 的invoke方法,而invoke方法根据代理类传递给自己的method参数来区分是什么方法

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(  
                ProxyTest.class.getClassLoader(),  
                new Class[]{HelloWorld.class},  
                handler); 

二、CgLib机制


JDK中提供的生成动态代理类的机制有个鲜明的特点是:某个类必须有实现的接口,而
生成的代理类也只能代理某个类接口定义的方法。这个时候CgLib来了,机制如下

1、查找target object上所有非final的public类型的方法定义(通过Enhancer创建动态代理)
2、将这些方法的定义转换成字节码
3、将组成的字节码转换为响应的代理的class对象(Enhancer.setCallback插入method interceptor)
4、实现MethodInterceptor接口,用来处理对代理(必须实现intercept方法)

完美解决JDK动态代理的这个问题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值