最近在考虑一个问题:java中如何在运行时改变方法的执行,就是在方法中动态增加一些原本代码中没有的动作。
怎么做?首先浮现在我脑子里就是那些繁琐的反射API以及AOP的想法。但反射API或Proxy类的相关API只能做到“在方法调用的前后做一些事情”,并不能做到“在方法内部做一些改动”。
我先后在学校论坛、sun中国技术社区发布帖子寻求答案。
今天突然想到一些底层的东西,发现我这个想法貌似很天真且不可能——方法里的东西,不是局部变量就是对其它函数的调用,而这些东西是被压在当前线程的调用栈里的,貌似要在运行时动态改变这些已经压栈了的东西是不可能的。
再说了,java是“强制面向对象编程语言”,能像我说的那样做的话是破坏封装的,不是java的一贯风格。
不过,sun技术社区的朋友给了一个简单有效的建议:改变设计!
大概代码如下:
public interface Interceptor{
void run();
}
public class Test{
private Interceptor interceptor;
public void setInterceptor(Interceptor inter){
this.interceptor = inter;
}
public void testMethod(){
//doSomething
if(interceptor != null){
interceptor.run();
}
//doSomething
}
}
这样,通过这个设计,就随时可以把想要额外执行的代码封装成一个Interceptor对象,然后“塞”进这个testMethod方法里,非常有新意!而且效率比反射或Proxy都高得多!绝对值得考虑!
唉~最近忙于复习java的一些基本的东西,脑袋可能僵在那一大堆API里了...看来时刻不能忘记设计的威力,很多时候能解决连技术也无能为力的难题。