java动态代理
来源:互联网 发布:淘宝店面粉红招牌图片 编辑:程序博客网 时间:2024/06/05 19:56
java有两种动态代理,JDK动态代理和CGLib动态代理,二者的区别如下
* 代理范围:JDK代理只能代理实现了接口的类,CGLib可以代理没有实现接口的类(spring AOP 中如果类实现了接口,默认使用JDK代理)
* 实现原理:CGLib使用底层的字节码技术,为被代理类生成子类,在子类中使用方法拦截技术拦截父类方法的调用,因为是继承,所以被代理类和方法最好不要声明为final(注意:CGlib代理依赖CGLib.jar和asm.jar)
*性能:CGGlib创建的代理对象要比JDK的性能高很多,但是创建时所花费的时间却比JDK动态代理要多,CGLib适合单例等生命周期比较长的对象。
例子
接口和被代理类
public interface subjectInterface { public void doTask();}public class Subject implements subjectInterface { @Override public void doTask() { // TODO Auto-generated method stub System.out.println("执行任务"); }}
JDK代理
import java.lang.reflect.*;public class JDKDynamicProxy implements InvocationHandler { private Object target;// 被代理对象 // 返回代理对象 public Object bindTarget(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub Object result = null; result = method.invoke(target, args);// 实现代理 return result; }}
CGLib 代理
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CGlibProxy implements MethodInterceptor { private Object target; // 创建代理对象 public Object bindTarger(Object target) { this.target = target;// 设置被代理对象 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass());// 设置要创建的子类的父类 enhancer.setCallback(this);// 回调方法 return enhancer.create();// 通过字节码技术动态创建子类 } @Override // 拦截父类方法的调用,可在这里织入横切逻辑 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub Object result = proxy.invokeSuper(obj, args);// 调用父类方法 return result; }}
测试
public class ProxyTest { public static void main(String[] args) { Subject subject = new Subject(); JDKDynamicProxy proxy = new JDKDynamicProxy(); subjectInterface s1 = (subjectInterface) proxy.bindTarget(subject); System.out.println("使用JDK动态代理"); s1.doTask(); CGlibProxy cglibproxy = new CGlibProxy(); Subject s2 = (Subject) cglibproxy.bindTarger(subject); System.out.println("使用CGLib代理"); s2.doTask(); }}
结果
使用JDK动态代理
执行任务
使用CGLib代理
执行任务
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- 银行储蓄系统
- Myeclipse如何自动创建hibernate
- CocoaPods详解之----使用篇
- vc++ 多线程编程(初学)
- 互联网蜗牛求职记--笔试面试汇总
- java动态代理
- codeforces 183B - Zoo
- iOS C语言6.2_函数多文件管理
- 【VB】table表列求和(机房问题)
- ios学习笔记--(c基础题3)
- 1252 - Twenty Questions(状态压缩DP)
- Java学习之路0717(四)(数组、字符串)
- 开个博客纪念下
- 排序算法