诊断Java代码: 消除包间的耦合关联 - 编程入门网
toolkit {
import my_awt: awt_s;
export my_toolkit: toolkit_s<my_awt>;
}
atom default_awt {
export my_awt: awt_s;
}
compound app {
export my_view: view_s;
local v: app_view, a: default_awt, t: default_toolkit;
link
a@my_awt to t@my_awt, a@my_awt to v@my_awt,
t@my_toolkit to v@my_toolkit,
v@my_view to my_view;
}
注意单元 app 中的 local 子句。这条子句定义了表示“单元实例”的局部变量。这些单元实例中的类是实际链接的元素。通过链接单元实例(而不是直接链接单元),Jiazzi 可以清楚地表明 复合单元中的链接不影响各组成单元的定义。 通过为程序指定这些签名、原子和复合,我们描述了如何将程序中的各个包链接在一起。Java 源文件是指单元所输入和输出的包,但在另一方面它们看上去象普通的 Java 文件。下一节将详细讲述如何使用 Jiazzi 来以单元所指定的方式将 Java 类真正链接在一起。 诊断Java代码: 消除包间的耦合关联(4)时间:2011-02-11 IBM Eric E. AllenJiazzi 的工作原理 Jiazzi 分三个阶段编译代码: 首先,将一组签名和单元定义传送给 Jiazzi 存根生成器,然后,Jiazzi 存根生成器为传递给该生成器任何单元的签名中所导入的所有类生成存根类文件。 然后,常规的 Java 编译器使用这些类文件来编译源文件,这些源文件对应于提供给存根生成器的单元所导出的类。 编译完源文件后,Jiazzi 单元链接程序检查结果类文件是否与原来单元中所声明的类签名匹配。必需要有这一步,因为: Jiazzi 可以与任何第三方的编译器共同使用 Jiazzi 从不检查 Java 源文件 (顺便说一句,请注意,Jiazzi 这种事实上从不检查 Java 源代码的方法有其优越之处。它使 Jiazzi 可以与用于 JVM 的非 Java 语言的编译器一起使用,譬如 Jython、JSR-14 和 NextGen 编译器。事实上,Jiazzi 本身就是用 JSR-14 编写的。) 检查完之后,组件链接程序为提供给它的每个单元生成一个 JAR 文件。这个 JAR 文件包含已编译的源文件和存根以及作为元数据的签名信息。接着,通过将这些 JAR 文件传递给 Jiazzi 及相应的复合单元,从而将这些 JAR 文件链接起来。 Jiazzi 单元链接程序是脱机工作的,并且单独地工作在类文件常量池之上,而且会重命名隐藏的方法,从而避免了偶尔会发生的方法名称冲突。 通过特定的类装入器,还可以联机链接单元。然而,由于不能使用编译单元所依据的存根类,因此必须在类装入器中进行类型检查,作为“递增性整体程序分析”。事实上,Jiazzi 程序员目前必须将脱机链接和联机链接结合起来使用,因为在标准 Java 库中,有许多类只能通过类装入器来链接。 当前系统的另一个限制是,重命名会影响到 JNI 和反射库。尤其是不能重命名本机方法,因为它们是用 C 语言编写的。其结果是,许多类库(那些过度依赖 JNI 和反射的库)不能作为 Jiazzi 组件进行重新打包。 如上所说,复合单元描述其它单元间的连接。这些链接与该复合的导入和导出单元的绑定名称相关;已链接的单元完全不会意识到已将它们链接起来了(链接程序最终会将这些复合单元宏展开成原子)。 通过这种方式,用简单的重新编译换入和换出新包,从而使我们可以创建和分发程序的 JAR 文件。而不需要涉及一行 Java 源代码。 此外,其他 Jiazzi 用户能够在可以用 JAR 文件之前,根据程序所提供的类进行开发;他们所需要的只是相应导出的包签名。他们对包所做的扩展也只与那个包签名的任何其它实现相链接。 单元测试和 Jiazzi 基于组件的编程提供了许多优点。最常受到人们赞誉的优点是组件更大程度地方便了代码重用。可以单独分发组件成品,并按照自 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |