`
maqujun
  • 浏览: 135338 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javassist设计让EJB3变得更精彩

阅读更多

Javassist 是个日本人开发的一种执行字节码操作的强而有力的驱动代码库,后来归到了Jboss门下,看在Jboss的面子上,我们就勉强学习一下。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同 的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。看起来和ASMBCEL等字节码操作技术差不多,不过事实上的确也差不多只是使用起来更加的简单而已。<o:p></o:p>

Javassist已经在很多我们熟悉的项目中被悄悄地使用了,比如说Jboss, Tapestry hivemind(这一个非常棒的ICO容器,用过她之后,我都不想再看到Spring了,下次再详细介绍)等。<o:p></o:p>

本来想详细写一下使用方法,可是在Javaeye里搜索了一下,结果一位Icon是星爷的同志已经先我一步了,我详细的看了一下,他把基本的Javassistmethod的操作介绍的很详细了。那我就不重复了,这是他的文章的链接。<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或是StatefulEJB类型。来实行Ejb3服务。举例:

java 代码
 
  1. @Stateless  
  2. @TransactionAttribute(NEVER)  
  3. @ExcludeDefaultInterceptors  
  4. public class ServiceBean implements Service {  
  5.     // 简单的weblogic stateless Ejb 定义方式。  
  6.         ...............  
  7. }  

从上面的例子可以看出,如果我们去除掉Annotation的话,ServiceBean仅仅就是个普通的Java Class. 所以我就想到可以运用Javassist去动态的注入相关的Ejb Annotation的方法。这样再配合IocXML的定义,就可以实现任何的Class都能动态的变为Ejb3 service了。<o:p></o:p>

xml 代码
 
  1. <?xml version="1.0"?>        
  2. <module id="dynamic.EjbService" version="1.0.0">  
  3.     <service-point id="Service" interface="com.maqujun.Service">  
  4.         <invoke-factory service-id="remote.factory">  
  5.                 <construct class="com.maqujun.ServiceBean" ejb-type="Stateless">  
  6.             // 可以定义相关的Ejb3所需的Annotation操作的声明。  
  7.             </construct>  
  8.         </invoke-factory>  
  9.     </service-point>  
  10.   <contribution configuration-id="hivemind.Remoting">  
  11.     <publish published-name="weblogic-Dynamic-Ejb"  
  12.            service-point="Service"  
  13.            protocol="EJB3">  
  14.     </publish >  
  15.   </contribution>  
  16. </module>  

以上的hivemodule.xml代码并不是正规的hivemindXML定义方式。是更改过的hivemind版本的代码,所以不具有参考价值,只是为了说明Ejb3的各种类型可以声明在xml中来获取。<o:p></o:p>

现在就用Javassist来注入EJB3 Annotation。(Javassist注入annotation教程 @_@ <o:p></o:p>

java 代码
 
  1. //首先要获得XML中定义的内容。这里就略了  
  2. ClassPool pool = ClassPool.getDefault();  
  3. CtClass ejb3Service = pool.get (ejbServiceName);  
  4. ClassFile classFile = ejb3Service.getClassFile();  
  5. ConstPool cp = classFile.getConstPool();  
  6. AnnotationsAttribute attr = new AnnotationsAttribute(cp,  
  7.         AnnotationsAttribute.visibleTag);  
  8. if (cont.getState()==State.STATELESS) {  
  9.     Annotation stateless = new Annotation("javax.ejb.Stateless", cp);  
  10.     attr.addAnnotation(stateless);  
  11.     //添加一个Stateless annotation,其他的annotation 也可以用相同的方法来实行….注意:如果Annotation中带有参数的可以使用new Annotation("annotation").addMemberValue(“ParamKeywork”, ArrayMemberValue);来实现。  
  12. }  
  13. classFile.addAttribute(attr);  
  14. UserClassloader.putClass(ejb3Service.toClass());  

<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>

分享到:
评论

相关推荐

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    javassist3

    javassist-3.0-rc-1.jar

    jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b

    这个名为 "jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b" 的压缩包包含了 Javaassist 库的一个特定版本,即 3.23.0 GA 版本的修订版 gf85a72b。在 Java 开发中,Javaassist 提供了一种简单的方法来创建和...

    javassist+jd-gui

    `javassist` 提供了类似于 Java 的语法来操作和创建类,使得字节码级别的操作变得相对直观和易用。 具体来说,`javassist` 主要有以下几个关键功能: 1. **类的加载与操作**:它可以加载类到内存中,并且提供了丰富...

    javassist官方手册(中文)

    Javassist 官方手册中文版 Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。...通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。

    javassist-3.23.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javassist-3.19.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.19.0-GA.jar; 赠送原API文档:javassist-3.19.0-GA-javadoc.jar; 赠送源代码:javassist-3.19.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.19.0-GA.pom; 包含翻译后的API文档...

    javassist-3.21.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

    javassist-3.24.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javaagent+javassist

    Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...

    jboss-javassist-javassist-rel_3_22_00_ga-46-g40d3223.zip

    Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。

    javassist-3.18.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.18.1-GA.jar; 赠送原API文档:javassist-3.18.1-GA-javadoc.jar; 赠送源代码:javassist-3.18.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.18.1-GA.pom; 包含翻译后的API文档...

    javassist包

    javassist包

    javassist-3.27.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.27.0-GA.jar; 赠送原API文档:javassist-3.27.0-GA-javadoc.jar; 赠送源代码:javassist-3.27.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.27.0-GA.pom; 包含翻译后的API文档...

    javassistDemo.zip

    这个"javassistDemo.zip"压缩包提供了一个示例,展示了如何利用Javaassist库动态修改Java类的方法。在Java应用程序中,这种能力非常有用,特别是在进行AOP(面向切面编程)或者在无法重新编译源代码的情况下需要修改...

    javassist-3.24.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist-3.20.0-GA.zip

    在Javassist中,`CtConstructor`, `CtField`等类分别代表构造函数和字段,它们提供了与方法类似的API,使得对这些元素的修改变得简单。同时,`CtBehavior`类作为方法和构造函数的基类,提供了一些通用的操作接口。 ...

    java 反编译工具 jboss-javassist

    3. **代码解析与生成**:Javassist提供了一套API,可以将Java源代码字符串转换为字节码,同时也支持从字节码反解析为源代码表示,尽管可能不完全忠实于原始源代码。 4. **面向切面编程(AOP)**:在AOP中,...

    Javassistjar包

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javassist-3.18.2-GA.jar

    javassist-3.18.2-GA.jar

Global site tag (gtag.js) - Google Analytics