代理是用来做什么的?
一段代码:
public class CglibTest{
public static void main(String[] args) {
//normal
System.out.println("//normal test...");
MyInterface mf = new MyInterfaceImpl();
String ret = mf.method3("param method3");
System.out.println(ret);
//with proxy
System.out.println("//with proxy test...");
MyInterface mfWithProxy = CglibProxy.newProxyInstance(MyInterfaceImpl.class);
String retWithProxy = mfWithProxy.method3("param method3");
System.out.println(retWithProxy);
}
};
输出:
//normal test...
param method3
//with proxy test...
before:invoke...
after:invoke...
param method3
代理是用来做这的
MyInterface.method3(String param)很简单,只是把传入的参数返回。
用代理其实和拦截器的道理一样,就是在方法前后执行其他的代码。这里输出before..,after…
怎么实现的呢?
class CglibProxy implements MethodInterceptor {//(2)要实现MethodInterceptor
@Override//实现过程
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
Object ret = null;
System.out.println("before:invoke...");
ret = proxy.invokeSuper(obj, args);
System.out.println("after:invoke...");
return ret;
}
//(1)创建代理对象的方法
public static MyInterface newProxyInstance(Class targetInstanceClazz){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetInstanceClazz);
enhancer.setCallback(new CglibProxy());
return (MyInterface) enhancer.create();
}
}
图示