JDK动态代理和cglib的区别
分类:
- 基于接口的动态代理
- 基于子类的动态代理
cglib基于子类的动态代理:
- 涉及的类:Enhancer
- 提供者:第三方cglib库
-如何创建代理对象:
- 使用Enhancer类中的create方法
-创建代理对象的要求:
- 被代理类不能是最终类
-newProxyInstance方法的参数:在使用代理时需要转换成指定的对象
- ClassLoader:类加载器,用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法
- Callback:用于提供增强的代码,一般写的都是该接口的子接口实现类,MethodInterceptor
JDK基于接口的动态代理:
- 涉及的类:proxy
- 提供者:Jdk官方
-JDK动态代理如何创建代理对象:
- 使用Proxy类中的newProxyInstance方法
-创建代理对象的要求:
- 被代理类最少实现一个接口,如果没有则不能使用
-newProxyInstance方法的参数:在使用代理时需要转换成指定的对象
- ClassLoader:类加载器,用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法
- Class[]:字节码数组,它是用于让代理对象和被代理对象有相同方法。固定写法
- InvocationHandler:用于提供增强的代码,一般写一个该接口的实现类,通常情况加都是匿名内部类,但不是必须的
两者区别总结:
Cglib
|
JDK
|
|
是否提供子类代理
|
是
|
否
|
是否提供接口代理
|
是(可强制)
|
是
|
区别
|
必须依赖于CGLib的类库,但是它需要类来实现任何接口代理的是指定的类生成一个子类,覆盖其中的方法
|
实现InvocationHandler
使用Proxy.newProxyInstance产生代理对象
被代理的对象必须要实现接口
|
暂无评论