Javassist 是个日本人开发的一种执行字节码操作的强而有力的驱动代码库,后来归到了Jboss门下,看在Jboss的面子上,我们就勉强学习一下。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同 的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。看起来和ASM,BCEL等字节码操作技术差不多,不过事实上的确也差不多只是使用起来更加的简单而已。<o:p></o:p>
Javassist已经在很多我们熟悉的项目中被悄悄地使用了,比如说Jboss, Tapestry, hivemind(这一个非常棒的ICO容器,用过她之后,我都不想再看到Spring了,下次再详细介绍)等。<o:p></o:p>
本来想详细写一下使用方法,可是在Javaeye里搜索了一下,结果一位Icon是星爷的同志已经先我一步了,我详细的看了一下,他把基本的Javassist对method的操作介绍的很详细了。那我就不重复了,这是他的文章的链接。<o:p></o:p>http://www.iteye.com/topic/53740 <o:p></o:p>
我接下来要介绍的是我所设计的另类的使用Javassist的方法。<o:p></o:p>
大家都知道Java5.0 带给我们了一个有意思的新玩意儿@Annotation。 很多人对他是褒贬不一。但是我个人还是满喜欢annotation的。举例说明吧,Apache beehive中就大量的运用的Annotation技术,这种方法简化了Struts的开发,省去了很多配置xml的步骤。所以,这个还是其实还是不错的,我相信以后会有更多的项目会使用到他。<o:p></o:p>
我着重要介绍的是Javassist结合EJB3的应用。EJB3也是一个大量运用Annotation来省去配置文件的项目。他相比较EJB2简化了很多。我不知道其他人是如果运用EJB3的,但是在我的运用中,大量的Class仅仅就是被定义为Stateless或是Stateful的EJB类型。来实行Ejb3服务。举例:
从上面的例子可以看出,如果我们去除掉Annotation的话,ServiceBean仅仅就是个普通的Java Class. 所以我就想到可以运用Javassist去动态的注入相关的Ejb Annotation的方法。这样再配合Ioc中XML的定义,就可以实现任何的Class都能动态的变为Ejb3 service了。<o:p></o:p>
以上的hivemodule.xml代码并不是正规的hivemind的XML定义方式。是更改过的hivemind版本的代码,所以不具有参考价值,只是为了说明Ejb3的各种类型可以声明在xml中来获取。<o:p></o:p>
现在就用Javassist来注入EJB3 Annotation。(Javassist注入annotation教程 @_@) <o:p></o:p>
<o:p></o:p>
这些代码仅仅是要实现动态Ejb3 service的一小部分,因为如此定义Ejb3 service的话,就一定要用动态Deploy,去*.war文件运行时实现动态的部署Ejb3服务,而不是以Ejb3的形势放入Weblogic里。这部分很复杂,但我已经让他实现了。具体想法我曾发在Bea的论坛里,这里是地址,有兴趣的朋友可以看一下。<o:p></o:p>
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=39271&start=0&tstart=270 <o:p></o:p>
(我被骂的很惨,不过我也同意这种打破规范的设计的确不太好)<o:p></o:p>
我个人觉得这样做很酷,而且我在网上也没见过其他人做过。我正在考虑要不要做成通用的OpenSource项目,把所有的Ejb3内容都动态化,这样任何一个普通的Class就可以通过XML中的简单定义,而成为一个复杂的Ejb3的服务。<o:p></o:p>
* 相信随着Annotation运用的更加普及,Javassist的这一功能会有更大的用武之地。<o:p></o:p>
<o:p></o:p>