动态代理的出现给我们带来了很大的方便,大大提高了代码的扩展和健壮性,这里不再多讲述原理,今天主要使用一下动态代理链,话不多说,看代码:
1.创建一个代理类对象
package com.cai.spring.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 target;
/* public CglibProxy(Object target) {
this.target=target;
}
public Object getProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}*/
public void before() {
System.err.println("CglibProxy before");
}
public Object intercept(Object target, Method method, Object[] arg2, MethodProxy proxy) throws Throwable {
before();
proxy.invokeSuper(target, arg2);
System.err.println("CglibProxy end ---------------------------");
return null;
}
}
2。创建目标对象
package com.cai.spring.proxy;
public class TargetClassCglib {
public void add() {
System.err.println("I am add");
}
public void del() {
System.err.println("I am del");
System.err.println("del end --------------------");
}
public void update() {
System.err.println("I am update");
}
}
3。创建cglib过滤器
package com.cai.spring.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
public class CglibCalBakFilter implements CallbackFilter {
public int accept(Method method) {
if("add".equals(method.getName())) {
return 0;
}else if("del".equals(method.getName())) {
return 1;
}else if("update".equals(method.getName())) {
return 2;
}
return 0;
}
}
4.创建固定值过滤
package com.cai.spring.proxy;
import net.sf.cglib.proxy.FixedValue;
public class FixValueProxy implements FixedValue {
public Object loadObject() throws Exception {
System.err.println("FixValueProxy ....返回固定信息");
return null;
}
}
5。创建测试类
public void testcg() {
//创建字节码增强类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TargetClassCglib.class);
enhancer.setCallbackFilter(new CglibCalBakFilter());
Callback c1 = new CglibProxy();
Callback c2 = NoOp.INSTANCE;
Callback c3 = new FixValueProxy();
Callback[] callbacks=new Callback[] {c1,c2,c3};
enhancer.setCallbacks(callbacks);
TargetClassCglib cglib = (TargetClassCglib)enhancer.create();
cglib.add();
cglib.del();
cglib.update();
}
输出结果如下:
CglibProxy before
I am add
CglibProxy end ---------------------------
I am del
del end --------------------
FixValueProxy ....返回固定信息
总结:有输出结果可以看出,add动态代理进行了功能增强,del 原样输出,update输出是固定的值,并不会调用目标方法,由此我们可以想象spring aop 就是这样的原理,如果方法有增强标识则进行功能增强。(回掉数组与我们拦截器返回值对应)。