【深入JAVA】cglib动态代理

来源:互联网 发布:游族网络招聘 编辑:程序博客网 时间:2024/05/04 18:38

下面来看一个DEMO,应该能够直接的看到效果

1>委托类,没有实现接口

package com.wuxiao.proxy.cglib;/** * 委托类 * @author xwu * */public class CountImpl {public void queryCount() {System.out.println("调用查看账户方法...");}}
2>cglib代理类

package com.wuxiao.proxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** * cglib动态代理 * * @author xwu * */public class CountImplCglib implements MethodInterceptor {private Object target;public Object getInstance(Object target) {this.target = target;Enhancer enhancer = new Enhancer();// 设置父类enhancer.setSuperclass(this.target.getClass());// 回调方法enhancer.setCallback(this);// 创建代理对象return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("事务开始");proxy.invokeSuper(obj, args);System.out.println("事务结束");return null;}}
3>编写测试类

package com.wuxiao.proxy.cglib;/** * cglib测试类 * * @author xwu * */public class CglibTest {public static void main(String[] args) {CountImplCglib countImplCglib = new CountImplCglib();CountImpl countImpl = (CountImpl) countImplCglib.getInstance(new CountImpl());countImpl.queryCount();}}
4>看看运行效果

事务开始调用查看账户方法...事务结束

总结:JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。


------------------------------

end   by   wuxiao





0 0
原创粉丝点击