Java的三种代理

254 阅读2分钟

三种不同代理的区别: 1.静态: 由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。(目标 固定) System.out.println("开启事务");//扩展了额外功能 target.save(); System.out.println("提交事务"); 2.动态: 在程序运行时运用反射机制动态创建而成。(例如 日志的切面代理aop) 3.cglib: 三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。 - 使用动态代理的对象必须实现一个或多个接口 - 使用cglib代理的对象则无需实现接口,达到代理类无侵入。

1. 静态代理实现较简单,只要代理对象对目标对象进行包装,即可实现增强功能,但静态代理只能为一个目标对象服    务,如果目标对象过多,则会产生很多代理类。
2. JDK动态代理需要目标对象实现业务接口,代理类只需实现InvocationHandler接口。
动态代理生成的类为 lass com.sun.proxy.\$Proxy4,cglib代理生成的类为class     com.cglib.UserDao\$\$EnhancerByCGLIB\$\$552188b6
1. 静态代理在编译时产生class字节码文件,可以直接使用,效率高。
2. 动态代理必须实现InvocationHandler接口,通过反射代理方法,比较消耗系统性能,但可以减少代理类的数量,    使用更灵活。
3. cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,    需要重写方法,所以目标对象不能为final类。

而AOP的代理同时实现的JDK动态代理(默认)和cglib的代理模式(好用)