Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己。Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色。Java程序被编译为可运行于Java虚拟机中的二进制程序,并且假定Java API的class文件在运行时都是可用的。接着虚拟机运行程序,那些API则给予程序访问底层计算机资源的能力。无论Java程序被部署到何处,它只需要与Java平台交互,而不需要担心底层的硬件和操作系统。因此,它能够运行于任何拥有Java平台的计算机。
Java编程语言主要通过以下方式支持Java的平台无关性:它的基本数据类型的值域和行为都是由语言自己定义的。通过确保基本数据类型在所有平台上的一致性,Java语言本身为Java程序的平台无关性提供了强有力的支持。
Class文件定义了一个特定于Java虚拟机的二进制格式。Java class文件可以在任何平台上创建,也可以被任何平台的Java虚拟机装入并运行。它的格式,包括多字节值的高位优先存放约定,都有严格的定义,并且是与Java虚拟机所在平台无关的。
Java平台可以在各种各样不同类型的(从嵌入式设备到大型主机)计算机上实现。Java 以API定义方式地道了三个基础API集合:J2EE、J2SE、J2ME。
决定Java程序其平台无关性的最主要因素就是Java平台在不同的平台上被部署的程度。只有在拥有Java平台的计算机或设备上,才能运行Java程序。
Java平台的部署有一些复杂,因为并非所有的标准运行时库在每个Java平台上都是可用的。Java平台中保证可用的基本库集合被称为标准API。
除了程序所依赖的Java平台的版本之外,决定Java程序的平台无关性程度的另一个主要因素就是你是否调用了本地方法。当编写一个平台独立的Java程序时,必须遵守的一条最重要的原则就是,不要直接或间接调用不属于Java API的本地方法。
在不需要平台无关性的情况下,可以直接调用本地方法。一般来说,本地方法在三种情况下适用:为了使用底层的主机平台的某个特性,而这个特性不能通过Java API访问;为了访问一个老的系统或者使用一个已有的库,而这个系统或库不是用Java编写的;为了加快程序的性能,将一段时间敏感的代码作为本地方法实现。
本地方法本质上就和平台无关性不相容。重要的是你要调用的方法是否在“任何地方”都已实现。Java API在各种操作系统上的实现使用了本地方法来访问主机。当调用了Java API中的一个方法时,你就可以肯定它在任何地方都是可用的。而这个方法在某些地方是否使用本地方法实现的这个问题是无关紧要的。
在编写平台独立的Java程序时,还必须遵从两条原则:
1、不要依赖即时终结(finalization)来达到程序的正确性
2、不要依赖线程的优先级(thread prioritization)来达到程序的正确性
所有的Java虚拟机都必须有垃圾收集堆,但是不同的实现可能使用不同的垃圾收集技术。在Java虚拟机规范中的这个灵活性意味着,在不同的虚拟机中,一个特定的Java程序中的对象可能在不同的时间被垃圾回收。这也就意味着那些在对象背释放以前由拦截收集器运行的终结方法(finalizer)在不同的虚拟机中可能是在不同的时间运行的。
在不同的Java虚拟机的实现中,另一个变化和线程的优先级有关。Java虚拟机规范只保证了,程序中所有拥有最高优先级的可运行线程将会得到一些CPU时间。这个规范也保证了在较高优先级的线程被阻塞时,较低优先级的线程将会运行。但是,在较高优先级的线程没有被阻塞的情况下,并没有禁止较低优先级的线程的运行。为了保证多线程Java程序的平台独立,必须依赖同步(sychronization)而不是优先级来在线程之间协调相互间的动作。
在不同的Java平台的实现之间,另一个主要的变化就是用户的接口。在编写平台独立的Java程序时,用户界面是一个更为困难 问题。
Java平台的不同实现之间还有一个变化就是其bug。
因为Java平台的实现之间可能存在差异,依赖某些特定平台写的Java程序,以及在任何特定的Java平台的实现中都可能存在bug,所有应该尽可能在所有希望运行的平台上对java程序进行测试。
Java的体系结构允许开发者在平台无关性和其他考虑之间进行选择。编写平台无关性的程序时应遵从的七个规则:
1、选择程序要运行的主机和设备的集合
2、在目标宿主机中选择自认为足够好的Java平台版本,在该版本Java平台上编写运行程序
3、对于每个目标宿主机,选择一些程序将要运行的Java运行时环境
4、编写程序,使它只通过Java API的标准运行库来访问计算机
5、编写程序,使它不依赖垃圾收集器即时终结的正确性,也不依赖线程的优先级
6、努力设计一个用户界面,使它在你所有的目标主机上都能正常工作
7、在所有的目标运行时环境和所有的目标宿主机上测试程序
Java平台开发商都能以非标准的、平台相关的方式来扩展Java平台的标准组件,但是它们必须支持标准组件。所有Java平台的开发商必须签署许可证,要求保证在Java虚拟机和Java API层的相容性,但是允许在性能和扩展等领域存在差异。
Sun推出Java第一个版本三年后,Sun又发布了Jini。Jini试图定义一个计算机的体系结构,这个计算机是以新兴的嵌入式设备和消费性产品环境为代表的,这些设备联入一个到处存在的网络中。在支持Jini的设备中,对象通过网络在Java平台的实现之间传输,这些Java平台是在嵌入式设备或消费性产品、桌面型电脑以及服务器中的。