Java二进制兼容性原理[Java编程]
本文“Java二进制兼容性原理[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、概述
目前的软件越来越依靠于差别厂商、作者开辟的同享组件,组件管理也变得越来越重要.在这方面,一个极端重要的问题是类的差别版本的二进制兼容性,即一个类改变时,新版的类能否可以直代替换本来的类,却不至于破坏其他由差别厂商/作者开辟的依靠于该类的组件?
Java二进制兼容性概念的主要目标是推动Internet上软件的遍及重用,同时它还避免了大大都C++环境面对的底子类脆弱性问题——比方,在C++中,对域(数据成员或实例变量)的拜候被编译成相关于对象起始位置的偏移量,在编译时就肯定,假如类加入了新的域并重新编译,偏移量随之改变,原先编译的利用老版本类的代码就不能正常履行;虚拟办法调用也存在一样的问题.
C++环境普通采取重新编译全部引用了被改正类的代码来办理问题.在Java中,少量开辟环境也采取了一样的战略,但这种战略存在诸多限制.比方,假定有人开辟了一个程序P,P引用了一个外部的库L1,但P的作者没有L1的源代码;L1要用到另一个库L2.目前L2改变了,但L1无法重新编译,所以P的开辟和更改也遭到了限制.
为此,Java引入了二进制兼容的概念——假如对L2的更改是二进制兼容的,那么更改后的L2、本来的L1和目前的P可以顺利衔接,不会呈现任何错误.
首先来看一个简单的例子.Authorization和Hello类辨别来自两个差别的作者,Authorization供应身份考证和受权服务,Hello类要调用Authorization类.
package com.author1;
public class Authorization {
public boolean authorized(String userName) {
return true;
}
}
package com.author2;
import com.author1.*;
class Hello {
public static void main(String arg[]) {
Authorization auth = new Authorization();
if(auth.authorized("MyName"))
System.out.println("您已经通过考证");
else
System.out.println("您未能通过身份考证");
}
}
目前author1公布了Authorization类的2.0版,Hello类的作者author2但愿在不更改原有Hello类的情形下利用新版的Authorization类.2.0版的Authorization要比本来的复杂不少:
package com.author1;
public class Authorization {
public Token authorized(String userName, String pwd) {
return null;
}
private boolean determineAuthorization(String userName, String pwd) {
return true;
}
public boolean authorized(String userName) {
return true;
}
public class Token { }
}
作者author1答应2.0版的Authorization类与1.0版的类二进制兼容,大概说,2.0版的Authorization类仍旧满意1.0版的Authorization类与Hello类的约定.明显,author2编译Hello类时,无论利用Authorization类的哪一个版本都不会出错——实际上,假如仅仅是因为Authorization类进级,Hello类根本无需重新编译,同一个Hello.class可以调用肆意一个Authorization.class.
这一特点并非Java独有.UNIX系统很早就有了同享对象库(.so文件)的概念,Windows系统也有动态链接库(.dll文件)的概念,只要替换一下文件便可以将一个库改换为另一个库.就象Java的二进制兼容特点一样,名称的衔接是在运行时完成,而不是在代码的编译、衔接阶段完成,而因它也一样拥有Java二进制兼容性所具有的长处,比方改正代码时只需重新编译一个库,便于对程序的某一部份举行改正.但是,Java的二进制兼容性还有其独特的上风:
⑴ Java将二进制兼容性的粒度从整个库(大概包含数10、数百个类)细化到了单个的类.
⑵ 在C/C++之类的语言中,成立同享库普通是一种有意识的行为,一个利用软件普通不会供应很多同享库,哪些代码可以同享、哪些代码不可同享都是预先筹划的后果.但在Java中,二进制兼容变成了一种与生俱来的自然特点.
⑶ 同享对象只针对函数名称,但Java二进制兼容性考虑到了重载、函数签名、返回值范例.
⑷ Java供应了更完善的错误掌握机制,版本不兼容会触发非常,但可以便利地捕捉和处理.相比之下,在C/C++中,同享库版本不兼容常常惹起严重问题.
2、类和对象的兼容性
二进制兼容的概念在某些方面与对象串行化的概念类似,二者的目标也有一定的重叠.串行化一个Java对象时,类的名称、域的名称被写入到一个二进制输出流,串行化到磁盘的对象可以用类的差别版本来读取,前提是该类要求的名称、域都存在,且范例一致.下表对比了二进制兼容和串行化这两个概念.
对象串行化 | 二进制兼容 | |
实用于 | 对象 | 类 |
兼容要求 | 类,域 | 类,域,办法 |
删除操作招致不兼容 | 老是 | 不一定 |
改正拜候属性(public,private等)后能否兼容 | 是 | 否 |
二进制兼容和串行化都考虑到了类的版本不断更新的问题,答应为类加入办法和域,并且纯粹的加入不会影响程序的语义;近似地,纯真的构造改正,比方重新布列域或办法,也不会惹起任何问题.
以上是“Java二进制兼容性原理[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:Java的网络功效与编程
- ·下一篇文章:ThreadLocal的筹划与操纵
- ·中查找“Java二进制兼容性原理”更多相关内容
- ·中查找“Java二进制兼容性原理”更多相关内容