欢迎来到天天文库
浏览记录
ID:22679398
大小:112.51 KB
页数:12页
时间:2018-10-30
《classworking工具箱源代码生成与字节码生成的结合》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、JiBX1.0采用类处理技术对类编译后生成的字节码进行了增强并且支持直接生成新类。字节码生成比工作在源代码级具有一些显著的优势,然而,有时它却在生成和调试应用程序时造成一些麻烦。即使不考虑方便的问题,一些开发者也是除了“源代码”之外什么也不信任。JiBx2.0的首席开发人员DennisSosnoski要使JiBX2.0同时支持字节码生成技术和源代码生成技术。在这篇文章中,他讨论了源代码生成技术和字节码生成技术的不同之处并且对于如何协调二者给出了自己的看法。类处理技术允许程序直接处理由Java™源程序编译后生成的二进制类表示。我的JiBXXML数据绑定框
2、架就是这样的一个例子,它采用类处理技术增强了Java类文件,给类文件添加了实现与XML文件相互转换的方法。直接处理二进制类具有许多优势,包括当源文件不可用时仍然可以对类进行修改。在大多数情况下,这种二进制方法都是非常有效的。但是有时缺少源代码也有不利之处。例如:在调试过程中要使用源文件。Java调试器是被设计为工作在源代码级,如果没有与字节码指令相匹配的Java源代码,调试器实际上是无用的。如果使用基于类处理技术的框架产生错误,在追踪这些错误时,缺少源文件就成问题了。而JiBX并不从类文件中删除调试信息——这样您仍然可以照常调试原始代码——但是不能通过
3、添加的与XML相互转换的方法进行调试。除了调试的实用性问题外,很多开发者并不愿意信任一个框架在字节码级上处理他们的程序,并且他们自己不能方便地检查处理结果也让他们不舒服。我为JiBX2.0开发定的目标之一就是增加用源代码增强代替字节码增强的选项。在这篇文章里,我将对照地介绍处理这两种类型代码的难点和我实现时所采用的技术。同时,我也会讨论字节码操作的一些细节,这是我以前的文章中没有涉及到的,特别是在调用方法和控制流领域。源代码的替代品通常,编译器把Java源代码翻译成字节码指令序列。因此,大多数类处理库完全忽视了源代码并且只工作在字节码级上。惟一的例外情
4、况是Javassist库,它允许使用Java源代码的一种形式将字节码插入方法中或者构造新的方法(请参阅参考资料,找到我早期关于Javassist的Javaprogrammingdynamics文章)。JiBX2.0对于源代码/字节码提供双重支持的可能性,有可能建立在Javaassist的源代码处理方法上:不断地产生源代码,然后,当直接增强类文件时,Javaassist将源代码转换成字节码。但是Javassist对于源代码的支持是有限的,并且包含一些与标准Java源代码不同的特性(包括方法变量的引用方式)。其次,Javassist比一些其他的字节码库(特
5、别是ASM库,参看在文章“Classworkingtoolkit:ASMClassworking”中的讨论)速度慢。我认为字节码增强仍然是JiBX2.0的主要目标,在某些情况下(如使用JiBX联合一种IDE自动汇编),可能需要重复进行字节码增强,所以速度也是至关重要的。最后,javassistCPL证书与JiBX的BSD证书并不兼容。鉴于上述原因,我决定采用另外一种方法。我计划使用一个策略原型代替代码生成的实现,这时,根据使用源代码策略或者字节码策略的不同,同类型的操作将做不同的翻译。字节码生成与JiBX1.X的实现基本上是相同的(通过使用ASM库而不
6、是BCEL库)。源代码生成是新功能,并且它的结构形式必须考虑到在操作层面上与字节码生成的兼容性。回页首代码形式比较Java源代码通常被编译成字节码,并且一些工具甚至可以将字节码(至少是由通常的编译器产生的文件形式)反编译成源代码。这两种代码形式之间的相互转换表明二者之间具有很高的兼容性。即使如此,使用源代码的编程技术与字节码的编程技术之间仍然存在实质的不同。在这一节,我将举例说明一些不同之处。方法的参数和变量Java源代码通常把方法的参数当成一个特殊形式的本地变量,参数声明直接包含在函数声明中。这个原则有一个例外,虚方法使用一个特殊的第一参数,这个参数
7、不显示在方法的参数列表中。这个隐藏参数是指向调用这个方法的类实例的this指针。字节码对于方法参数的处理与本地变量相似。对于字节码,在方法执行的时候,每个参数占用堆栈结构的一个或者两个字。与源代码不同,字节码中的每个参数都是明确的——虚方法的this指针通常在堆栈结构中的0位置,接着是方法声明中明确定义的参数。不同的参数占用不同数量的堆栈结构位置,这取决于参数值类型的大小与标准字大小的比较。源代码中一般的本地变量都定义在一个块中,这个块可能是一个完整的方法体或者是一个嵌套块。在字节码中遵循同样的原则。尽管不是明确的块,字节码中定义本地变量时,也要定义一
8、个指令范围,在这个范围内,变量是有效的。同方法变量一样,本地变量占用堆栈结构中的字。在字节码中
此文档下载收益归作者所有