直接入题
(本例子需要asm.jar asm_commons.jar asm-util.jar cglib-nodep.jar.)链接:http://download.csdn.net/detail/eifjgoergfgrgr/4541325
假如我有一个操作类如下:
public void say(){
System.out.println("say");
}
}
按正常需求执行在main (){
Operate o=new Operate();
o.say();
}
完工。
但是现在我say的时候要思考,不然太鲁莽,所以我像这样改
实现一个cglib的接口
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Proxy implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("I am thinking firstly!");//就是在operate在调用一个方法的时候,首先要执行这一句,
arg3.invokeSuper(arg0, arg2);//这才是在执行你调用的方法,
//System.out.println("After saying");//如果定这一句的话,也会执行,你就会感觉到,这里其实就是新加入你的逻辑,并确定你加入的位置
return null;
}
}
在Main中调用
public class MainTest {
public static void main(String[] args) {
Enhancer e=new Enhancer();
e.setSuperclass(Operate.class);
e.setCallback(new Proxy());//这两句我的感觉就是在把Proxy 与要被Proxy(代理)的类连接起来,
//因为在Proxy的实现中,并没有明确地确定是对哪个类进行Proxy,在这里确定是类Operate
Operate o=(Operate)e.create();
o.sysout();
}
}
结果:
I am thinking firstly!
say
但是现在的话是每调用Operate里面的方法,都要先进行“I am thinking firstly",而有的方法是不需要的如listen,所以,在调用listen方法的时候应该让Proxy不进入intercept方法,即不输出I am thinking firstly!,所以,程序变成如下所示:
public class Operate {
public void say(){
System.out.println("say");
}
public void listen(){
System.out.println("listen");
}
}
同时不要加入一个过滤器(Filter)
public class AopFilter implements CallbackFilter{
@Override
public int accept(Method method) {
if(method.getName().equalsIgnoreCase("listen"))
return 1; //逻辑为,如果方法名为listen ,返回1,也就是说过滤掉listem方法,不进行代理,也就是不进入intercept
else
return 0;//与上述相反
}
}
在Main里面修改为:
public class MainTest {
public static void main(String[] args) {
Enhancer e=new Enhancer();
e.setSuperclass(Operate.class);
e.setCallbacks(new Callback[]{new Proxy(),NoOp.INSTANCE});
e.setCallbackFilter(new AopFilter());//加入上面定义的filter
Operate o=(Operate) e.create();
o.say();
o.listen();
}
}
结果:
I am thinking firstly!
saylisten//成功过滤掉