java的动态代理只能对接口进行代理,如果一个类没有实现任何接口,则需要使用Cglib的动态代理技术,
cglib的一种实现简单地讲就是一句话:为代理类创建一个子类,并拦截这个子类对父类方法的调用。
这么说比较抽象,下面三个简单的类实现了cglib的动态代理
入口类:
TestCglibMain.java
package cn.java.cglibproxy;
public class TestCglibMain {
public static void main(String[] args) {
//初始化代理类
CglibProxy proxy = new CglibProxy();
//创建代理子类
TestCglib test = (TestCglib)proxy.getProxy(TestCglib.class);
//调用父类方法
test.pringSomthing();
}
}
被代理类:
TestCglib.java
package cn.java.cglibproxy;
public class TestCglib {
public void pringSomthing(){
System.out.println("printSomthing is now!!!");
}
}
cglib代理实现类:
CglibProxy.java
package cn.java.cglibproxy;
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 Enhancer enhancer = new Enhancer();
public Object getProxy(Class<TestCglib> clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] arg2,
MethodProxy proxy) throws Throwable {
System.out.println("打印前");
Object result = proxy.invokeSuper(obj, arg2);
System.out.println("打印后");
return result;
}
}
执行入口程序,打印结果:
打印前
printSomthing is now!!!
打印后