CGLIB 和 JDK生成动态代理类的区别
来源:互联网 发布:zookeeper 默认端口 编辑:程序博客网 时间:2024/06/08 02:52
AOP 使用的设计模式就是代理模式,是对IOC设计的补充。为了扩展性,往往会加上反射,动态生成字节码,生成代理类。
这里往往还会使用到DI,把代理的实现类通过依赖注入的方式,传给代理工厂。
关于生成动态代理类的方式有两种:JDK和CGLIB。
CGLIB,是一个开源工具。spring 和hibernate已经广泛使用。
JDK动态代理和CGLIB字节码生成的区别?
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
这里往往还会使用到DI,把代理的实现类通过依赖注入的方式,传给代理工厂。
关于生成动态代理类的方式有两种:JDK和CGLIB。
CGLIB,是一个开源工具。spring 和hibernate已经广泛使用。
JDK动态代理和CGLIB字节码生成的区别?
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
实现接口:MethodInterceptor
回调方法:intercept
CGLIB:
- public Object createProxyObject(Object obj) {
- this.targetObject = obj;
- Enhancer enhancer = new Enhancer();
- enhancer.setSuperclass(obj.getClass());
- enhancer.setCallback(this);
- Object proxyObj = enhancer.create();
- return proxyObj;// 返回代理对象,返回的对象其实就是一个封装了“实现类”的代理类,是实现类的实例。
- }
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
实现接口:InvocationHandler
回调方法:invoke
JDK:
- public Object newProxy(Object targetObject) {// 将目标对象传入进行代理
- this.targetObject = targetObject;
- return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
- targetObject.getClass().getInterfaces(), this);// 返回代理对象
- }
看上面的代码。在动太生成代理类时,传递的是实现类所所实现的接口argetObject.getClass().getInterfaces()。JDK只能对于接口进行做代理。如果换成类的话,则会抛java.lang.ClassCastException异常。
0 0
- CGLIB 和 JDK生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别。
- 动态代理:JDK动态代理和CGLIB代理的区别
- 动态代理:JDK动态代理和CGLIB代理的区别
- 动态代理:JDK动态代理和CGLIB代理的区别
- jdk动态代理和cglib动态代理的区别
- jdk动态代理和cglib动态代理的区别
- java的jdk动态代理和cglib动态代理区别
- jdk动态代理和cglib代理区别
- JDK动态代理和CGLIB代理的区别
- JDK动态代理和CGLIB代理的区别
- Spring之JDK动态代理和cgLib的区别
- Java动态代理机制介绍(jdk和cglib的区别)
- adapter中操作listview之外的View 注意事项
- 发送HTTP请求 -- HttpUtil
- win32 edit控件尾部追加内容
- Java Web开发环境配置
- HDU1021 Fibonacci Again
- CGLIB 和 JDK生成动态代理类的区别
- Dito 手指尖的创意
- 欢迎使用CSDN-markdown编辑器
- Neural Turing Machines-NTM系列(一)简述
- 2015年终总结
- java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271) Ca
- uva 10306 e-Coin
- Activity切换动画·overridePendingTransition
- 面向过程 VS 面向对象