用了这个DynamicProxy以后,还是非常好的,好的地方是接口变了,这个动态代理类不用动。而静态代理就不一样了,接口变了,代理类也要动。但动态代理并不是万灵丹,它也有搞不定的时候,比如要代理一个没有任何接口的类,它就没有用武之地了。这个时候就只能使用CGlib这个类库。在spring和hibernate中都有使用CGlib实现动态代理。它是在一个运行期间动态生成字节码的工具,也就是动态生成代理类了,下面使用CGlib实现动态代理,写一个CGLibProxy:
package org.smart4j.framework.test;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by jack on 2017/6/27.
* 使用CGlib实现动态代理
*/
public class CGLibProxy implements MethodInterceptor{
private static CGLibProxy instance = new CGLibProxy();
public CGLibProxy() {
}
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
before();
Object result = methodProxy.invokeSuper(object,args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
public <T> T getProxy(Class<T> cls){
return (T) Enhancer.create(cls,this);
}
public static CGLibProxy getInstance(){
return instance;
}
}
package org.smart4j.framework.test;
/**
* Created by jack on 2017/6/27.
* CGlib动态代理测试
*
*/
public class MainTest2 {
public static void main(String[] args) {
Hello helloProxy = CGLibProxy.getInstance().getProxy(HelloImp.class);
CGLibProxy.getInstance().getProxy(HelloImp.class).sayHello("jack");
helloProxy.sayHello("jack");
}
}
网友评论