在关注技术实现的同时,别忘了设计模式的威力
最近在考虑一个问题: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里了...看来时刻不能忘记设计的威力,很多时候能解决连技术也无能为力的难题。
发表评论
- 浏览: 16164 次
- 性别:

- 来自: 杭州

- 详细资料
搜索本博客
我的相册
共 10 张
最近加入圈子
最新评论
-
虎书P8问题(1)
上面的代码有缺憾,没有考虑“如果print语句中的expList里面还有prin ...
-- by pf_miles -
如果我们不上大学,那么去 ...
我的经历很有限,我很庆幸,这让我对新东西如饥似渴. 但我年年都回答"我该报考哪所 ...
-- by pf_miles -
毕业宣告
太神奇.不懂... - -#
-- by Rooock -
如果我们不上大学,那么去 ...
怎么说呢?这个说法也很不错,但只能算是你个人有限的经历范围之内产生的一种观点而已 ...
-- by liuming -
Jboss Seam, mysql中文乱 ...
引用如果seam工程里面用到了richfaces也会出现乱码,因为richfac ...
-- by pf_miles






评论排行榜