cglib动态代理

来源:互联网 发布:佩斯大学 知乎 编辑:程序博客网 时间:2024/05/11 19:37

    JDK的动态代理是基于接口的,委托类必须实现接口。但是如果委托类没实现任何接口呢?这时就需要使用cglib的动态代理了。看例子

package cn.proxy;public class User {public void add(){System.out.println("add user......");}public void delete(){System.out.println("delete user........");}}


 

package cn.proxy;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{public Object getProxy(Object target){Enhancer enhancer=new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);//这个方法可以放到测试类那些,只要new 一个CglibProxy代替这个this就OK了return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] param,MethodProxy methodProxy) throws Throwable {System.out.println(methodProxy.getSuperName()+"   "+method.toString()+"   执行前......");Object result=methodProxy.invokeSuper(obj, param);System.out.println(methodProxy.getSuperName()+"   "+method.toString()+"   执行后......");return result;}}


 

package cn.proxy;import net.sf.cglib.core.DebuggingClassWriter;public class CglibClientTest {public static void main(String[] args) {//将cglib生成的东西给打印出来System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:/tmp/1");   User userProxy=(User)(new CglibProxy().getProxy(new User()));userProxy.add();userProxy.delete();}}

运行结果

CGLIB debugging enabled, writing to 'E:/tmp/1'
CGLIB$add$0   public void cn.proxy.User.add()   执行前......
add user......
CGLIB$add$0   public void cn.proxy.User.add()   执行后......
CGLIB$delete$1   public void cn.proxy.User.delete()   执行前......
delete user........
CGLIB$delete$1   public void cn.proxy.User.delete()   执行后......

        用反编译工具看了下E:/tmp/1下的内容,发现生成的东西挺多的,不像JDK动态代理那样就生成一个代理类,很容易就看明白了运行过程。下面就贴下生成的目录吧,至于源码就不贴了(水平有限,没能完全搞懂。。。。)

原创粉丝点击