二进制兼容性深度解析
1. 二进制兼容性概述
二进制兼容性指的是对类型的更改不会破坏与现有二进制文件的兼容性,即之前能无错误链接的二进制文件在更改后仍能无错误链接。为实现这一点,需满足以下条件:
- 每个成员类型必须有足够信息以恢复其源级别的访问修饰符。
- 每个嵌套类必须有对其直接外部类的符号引用。
- 包含嵌套类的每个类必须包含对其所有成员类、以及在其方法、构造函数和静态或实例初始化器中出现的所有局部和匿名类的符号引用。
二进制文件编译时依赖其他类和接口的可访问成员与构造函数。为保持二进制兼容性,类或接口应将其可访问成员和构造函数及其存在与行为视为与用户的契约。Java 编程语言旨在防止契约的添加和意外的名称冲突破坏二进制兼容性,例如,添加重载特定方法名的更多方法不会破坏与现有二进制文件的兼容性,因为现有二进制文件在编译时通过方法重载解析算法选择要使用的方法签名。
需要注意的是,二进制兼容性与源兼容性不同。例如,一组兼容的二进制文件可能由无法一起编译的源文件生成。新声明的添加可能会改变源代码中未更改部分的名称含义,而该部分源代码的现有二进制文件仍保留该名称的完全限定的先前含义。要生成一致的源代码集,需要提供与先前含义相对应的限定名称或字段访问表达式。
2. 包的演变
在不重用先前赋予不相关类型的名称的前提下,可向包中添加新的顶级类或接口类型,而不会破坏与现有二进制文件的兼容性。若新类型重用先前赋予不相关类型的名称,则可能会导致冲突,因为同一类加载器无法加载这两种类型的二进制文件。
非公共的顶级类和接口类型,且不是公共类型的超类或超接口的,其更改仅影响声明它们的包内的类型。这些类型可以
超级会员免费看
订阅专栏 解锁全文
976

被折叠的 条评论
为什么被折叠?



