当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .