快速业务通道

Java二进制兼容性原理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
种有意识的行为,一个应用软件一般不会提供很多共享库,哪些代码可以共享、哪些代码不可共享都是预先规划的结果。但在Java中,二进制兼容变成了一种与生俱来的天然特性。

⑶ 共享对象只针对函数名称,但Java二进制兼容性考虑到了重载、函数签名、返回值类型。

⑷ Java提供了更完善的错误控制机制,版本不兼容会触发异常,但可以方便地捕获和处理。相比之下,在C/C++中,共享库版本不兼容往往引起严重问题。

二、类和对象的兼容性

二进制兼容的概念在某些方面与对象串行化的概念相似,两者的目标也有一定的重叠。串行化一个Java对象时,类的名称、域的名称被写入到一个二进制输出流,串行化到磁盘的对象可以用类的不同版本来读取,前提是该类要求的名称、域都存在,且类型一致。下表比较了二进制兼容和串行化这两个概念。

对象串行化 二进制兼容
适用于 对象
兼容要求 类,域 类,域,方法
删除操作导致不兼容 总是 不一定
修改访问属性(public,private等)后是否兼容

二进制兼容和串行化都考虑到了类的版本不断更新的问题,允许为类加入方法和域,而且纯粹的加入不会影响程序的语义;类似地,单纯的结构修改,例如重新排列域或方法,也不会引起任何问题。

Java二进制兼容性原理(2)

时间:2010-12-15

三、延迟绑定

理解二进制兼容的关键是要理解延迟绑定(Late Binding)。延迟绑定是指Java直到运行时才检查类、域、方法的名称,而不象C/C++的编译器那样在编译期间就清除了类、域、方法的名称,代之以偏移量数值——这是Java二进制兼容得以发挥作用的关键。

由于采用了延迟绑定技术,方法、域、类的名称直到运行时才解析,意味着只要域、方法等的名称(以及类型)一样,类的主体可以任意替换——当然,这是一种简化的说法,还有其他一些规则制约Java类的二进制兼容性,例如访问属性(private、public等)以及是否为abstract(如果一个方法是抽象的,那么它肯定是不可直接调用的)等,但延迟绑定机制无疑是二进制兼容的核心所在。

只有掌握了二进制兼容的规则,才能在改写类的时候保证其他类不受到影响。下面再来看一个例子,FrodoMail和SamMail是两个Email程序:

abstract class Message implements Classifiable { } class EmailMessage extends Message {  public boolean isJunk() { return false; } } interface Classifiable {  boolean isJunk(); } class FrodoMail {  public static void main(String a[]) {   Classifiable m = new EmailMessage();   System.out.println(m.isJunk());  } } class SamMail {  public static void main(String a[]) {   EmailMessage m = new EmailMessage();   System.out.println(m.isJunk());  } }

如果我们重新实现Message,不再让它实现Classifiable接口,SamMail仍能正常运行,但FrodoMail会抛出异常:java.lang.IncompatibleClassChangeError at FrodoMail.main。这是因为SamMail不要求EmailMessage是一个Classifiable,但FrodoMail却要求EmailMessage是一个Classifiable,编译FrodoMail得到的二进制.class文件引用了Classifiable这个接口名称。符合Classifiable接口定义的方法仍旧存在,但该类却根本没有提到Classifiable这个接口。

四、兼容规则:方法

从二进制兼容的角度来看,一个方法由四部分构成,分别是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号