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();
}
@Override
public 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动态代理那样就生成一个代理类,很容易就看明白了运行过程。下面就贴下生成的目录吧,至于源码就不贴了(水平有限,没能完全搞懂。。。。)