《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > Java平台J2SE1.5新特性展望

Java平台J2SE1.5新特性展望

2008-12-19
作者:盛建昉

0.引言
    J2SE平台目前的正式发布的版本为1.4.2,下一个主要Java平台J2SE1.5正在JCP(Java Community Process)的指导下进行开发,预期这个代号为“Tiger”的新版本将会在2003年最后一个季度发布Beta测试版,2004年初正式发布。这个最新的Java平台将会给Java世界带来些什么激动人心的新特性" title="新特性">新特性呢?根据JSR-176(Java Specification Request)、Java新闻组、Java社区论坛以及Sun公司发布的信息,新版本Java主要致力于以下几个方面的改进:
1. 可靠性、可用性" title="可用性">可用性和适用性
2. 监视与可管理性
3. 可伸缩性与执行性能
4. XML和客户Web服务
5. 易于开发
    为了支持这些改进,新平台修改了相关的语法,增加了核心类库的API数量,修正了一些缺陷并对平台做了进一步优化。下面分别对这五个方面作详细介绍。
1.可靠性、可用性和适用性
    Java平台工具的成熟度、普及性、正在增长的各方支持以及可用性等诸多因素的结合使得面向关键任务" title="关键任务">关键任务的企业Java应用越来越多。面向关键任务的应用必须是高确定性、高可靠性和高可用性的。系统故障事件发生时,面向关键任务的应用需要立即被诊断、处理和修复。为了满足这种需求,新Java平台计划针对客户和服务器的Java运行时(Java Runtimes)做出一些修补和优化来提高平台的可靠性和可用性。为了达到这一目的,新平台还增加了两个新的API规范。
1.1新Java平台Profiling体系结构
    平台Profiling是正在运行的虚拟机抽取系统资源使用状况统计数据的能力,包括内存使用状况、CPU使用状况、对象引用数目等等。现有的Profiling接口—JVMPI(Java Virtual Machine Profiling Interface)带有相当的实验性质,而且种种设计缺陷,规模可伸缩性问题,过于庞大的开销以及不精确的Profiling,使得这一接口难以使用。新的Profiling体系结构打算非兼容的取代JVMPI,提供类似的功能并进行了增强。这些新的Profiling API将提供Profiling与高级垃圾收集(garbage collection)技术之间的互操作性,能在最大范围的虚拟机上被可靠实现,其中一部分将根据功能分组,以可选集合形式获取,并提供支持何种选项的查询。新的API致力于提供一个Java语言的执行模型,而虚拟机的其他一些方面、本地化及操作系统模型可能直接提供,也可能通过扩展机制提供。新的Profiling API可以被实现为能动态地打开或禁止Profiling功能,这样当Profiling功能禁止时对性能的影响可以忽略。应用开发阶段的Profiling会成为这个规范的主要目标,并且支持低开销及混杂数据的设计目标也将会支持部署阶段的Profiling。
l.2 与应用隔离的API规范
    当在同一个主机上运行多个Java应用时,庞大的初始化区、内存需求的增长以及程序启动的延时损害了Java固有的能力,在与其他一些更灵活高效的语言系统竞争时,人们会怀疑Java在大规模可伸缩场合下的应用前景。目前在服务器设置工作中,专门的脚本和本地代码机制用于控制和平衡装载多个Java虚拟机,这种方式损害了可移植性、可维护性和系统的鲁棒性。这个与应用相隔离的API规范为管理Java应用的生命周期提供了统一的机制,使得这些Java应用在对象获取方面互相隔离,但能潜在共享实现方面的资源。它提供了一种配置Java新实现特性的手段,这新的实现特性替代了以前在部署多个Java应用时采用的专门的脚本机制,并增强了应用规模的可伸缩性。API与应用隔离的特性的实现保证了Java应用之间运行状态的隔离,也许还会隔离本地接口(JNI)状态和进程状态。新平台中包含这个API会使在同一主机上运行多个Java应用变得更加容易,并且不用担心操作系统资源被内存中的多个JVM的拷贝所消耗。这对系统可靠性和可用性有着直接的影响。
2.监视与可管理性
    随着面向关键任务Java应用的广泛布署,产生了这样一种需求:为Java应用及其相应的虚拟机的状态提供一种统一标准的监视机制,并且要求在不重新启应用程序" title="应用程序">应用程序的条件下修改应用程序的状态和运行时的特性。目前应用程序倾向于使用本地库和程序完成类似的功能。新的JAVA平台计划引入一簇API来完成对基于Java的资源端到端的管理和监视。
2.l Java虚拟机(JVM)的监视与管理
    这类API将为JAVA应用程序,系统管理工具和RAS相关工具提供监视JVM状况,管理运行时间控制的能力,比如类装载,内存使用状况统计,垃圾收集(garbage collection)统计,线程统计,对象引用数及状态统计,操作系统及平台信息。它们还提供对JIT编译,线程创建,垃圾收集操作及堆分配的控制,支持JMX调用,并且这类特性的实现将与新平台的Profiling体系结构协同开发。
2.2Java管理扩展(JMX)
    JMX是一项已存在的技术,并且正在用于多种应用中,比如JBOSS应用服务器使用了JMX核心管理系统。这些扩展在Java语言中为应用程序及网络的管理和监视定义了体系结构,设计模式,API和服务。
    JMX为Java开发人员提供了提交Java代码、创建智能Java代理、实现分布式管理中间件和管理器的种种手段,并可将这类解决方案平滑地集成到已有的管理和监视系统中去。另外,JMX被许多用于现存管理和监视技术的API所引用。如今将JMX纳入Java标准平台满足了Java社区统一管理和监视Java应用的要求。
3.可伸缩性与执行性能
    新平台打算修正一些缺陷并提高Java运行时的性能(包括客户端及服务器端)。以下是为提高性能所做的具体改进:
· 修正和加速了垃圾收集机制(garbage collection)
· 减少了虚拟机的启动时间
· 减少了内存的覆盖范围
· 进一步改进了Hotspot虚拟机
· 应用程序隔离API将使得单个虚拟机伸展为多应用虚拟机而不需要实例化新的虚拟机进程
· 增加了新的文件I/O能力支持批量访问文件属性,为文件和网络套接字增加了异步I/O,增强了格式化I/O
    这些特性的改进使得新平台成为至今最快的Java平台。
4.XML和客户Web服务
    看起来无处不在的XML和Web服务使得标准Java平台不得不对其提供支持。目前Java1.4已有一打XML解析器,相关XML数据结构库和XML处理库。Java1.5打算引进现存于SUN公司的WSDP(Web Service Developer Pack)中的一些库来增加标准平台中XML及Web服务API的数目。预期加入的新特性有:
· XML解析API(JAXP)的更新,以支持XML Schemas
· XML绑定API,用于将XML Schema编译进一个或多个Java类中
·  XML远程过程调用API(JAX-RPC)
·  XML数字签名API
· XML数字加密API
·  现有XML库的优化和性能提升
·  Web服务客户端支持
    由于XML及Web服务发展飞速,新版本Java希望成为使用这种技术创建应用的自然选择。
5.易于开发
    Java语言和语法正在被增强:代码更可读、更富于表达、更安全、更易于开发,并且没有失去兼容性。经过几年的讨论和与其它语言的比较,Java的这些新特性正在被融合。这些特性是新版本中最希望被引用的,并且引发了Java社区广泛的讨论。这些改变包括类文件格式的更改,泛型(类似于C++中的模板)支持,“foreach”型的循环结构,原始类型与相应对象数据类型自动转换,使用静态常量的改进语法,以及元数据" title="元数据">元数据标签的使用等等。
    这些改变对开发人员写Java程序的方式将会发生重要影响。要想利用这些改变,开发人员需要学习新的语言特性、新的语法。下面让我们深入了解一下这些新特性。
 · 类文件格式的改变
    这个改变是为了增加对不断更新的Java平台及语言规范的支持,包括增加对更快和更有效的字节码校验的支持,直接从类文件格式支持类字面量,增加以往暗含限制类文件的大小。这些改变对应用开发人员是透明的,现在代码不需要作任何改变。

 · 泛型的支持
    泛型支持是一种指定用于类集中的特定对象类型的功能,而不是使用缺省的Object类型的行为。这种想法基于参量的多态机制。下面用例子加以说明。
   比如你有一个方法,用来打印类集中所以字符串的小写形式:
   /**
      * Print all the Strings in the Collection in lower case.
      **/
public void printLowerCase(Collection c) {
    Iterator iter = c.iterator();
      while(iter.hasNext()) {
          String str = (String)iter.next();
System.out.println(str.toLowerCase());
        }
     }
    这里需要注意的是每次迭代经过Collection时都要有显式的类型转换,转换到String。这是一种产生错误的倾向。如果一个程序员不小心传递了其它类型的类集,这个方法编译成功,但会在运行期产生一个ClassCastException。这段代码正确执行的前提是Collection必须容纳String。这从方法的签名中看不出来,只是在描述方法的文档里提到。
    泛型提供了一种避免类型转换的方法,它将一般类集与特定类型在编译时而不是运行时绑定在一起。以上方法以泛型方式书写如下:
/**
* Print all the Collection Strings in lower case.
**/
public void printLowerCase(Collection c) {
Iterator iter = c.iterator();
    while(iter.hasNext()) {
String str = iter.next();
       System.out.println(str.toLowerCase());
    }
}
    这里我们显式指定了Collection将要包含哪种类型的对象,从而不需要强制类型转换。程序员的意图完全可以从方法签名中表现而不是在注释文档中描述。若使用此方法的程序员错误地传递了类型所包含的类型,此方法不会通过编译。这消除了运行时的异常,提供了编译时类型的安全性。泛型将会提高代码的可读性、表达能力,并提供了安全性,避免产生运行时异常。
· “foreach”循环结构
    新版本Java计划加入其它语言中常见的“foreach”循环结构,这个结构主要是为了增加开发人员的生产力,减少循环迭代所需要的代码数量。
    比如我们要对一个包含字符串的类集循环迭代,目前你可用while或for循环语句:
Collection c;
Iterator i = collection.iterator();
while(i.hasNext()) {
  // Process element
}
for(Iterator i = c.iterator; i.hasNext() ; ) {
  // Process element.
}
     这两种结构都需要创建一个Iterator对象,并且调用hasNext()方法显式地在迭代遍历类集。
    “增强的for结构”使得代码变为如下所示:
Collection c;
for( Object o : c ) {
  //Process element
}
结合泛型支持代码可变为:
Collection c;
for( String o : c) {
  //Process element
}
“foreach”类型的结构消除了Iterator的创建,将完成迭代的细节交给了编译器,同时也减少了代码的数量。
·  原始类型与相应对象类型的自动转换
    在现在的Java平台中如果你想将一个原始的int型加到一个Integer对象上,你必须这样做:
int i;
Integer j;
int k = i + j.intValue();
Integer kObj = new Integer(k);
在Java1.5中这种转换变成了自动进行,代码只要简单写成
int i;
Integer j;
int k = i + j;
Integer kObj = i + j;
    这一特性为程序员几乎消除了原始类型与相应对象类型间的所有差异。更进一步,它允许将原始类型加入到类集中去。因此这段代码
Collection c;
int i;

c.add(new Integer(i));
可变为
c.add(i);
 · 使用静态常量的语法改进
    在Java中使用常量,程序员必须完全限制常量的引用或者实现一个定义常量的接口,例如:
public interface Constants {
  public static final int DAYS_IN_WEEK = 7;
  public static final int DAYS_IN_YEAR = 365;
}
    要使用这些常量,程序员必须完全限制常量引用:
int weeks_in_year =
    Constants.DAYS_IN_YEAR/Constants.DAYS_OF_WEEK;
或实现一接口
public class Year implements Constants {
  int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
新版本Java中将引入一个“static import”工具,允许不用加类名前缀或实现一个接口引用静态常量。
import static Constants;
public class Year {
  int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
Import语句使得所有Contants类的静态成员对类Year都是可见的。这种紧凑的语法减少了代码并克服了实现一个接口的不利之处。
 · 元数据标签注释源代码
    编写EJB和RMI应用的程序员需要定义许多样板代码来实现对象。例如要实现一个远程对象,你必须定义一个接口:
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServiceRunner extends Remote {
    Object executeService(Service s) throws RemoteException;
}
并且定义一个此远程接口的实现:
package servicerunner;
import java.rmi.*;
import java.rmi.server.*;
public class ServiceRunnerImpl extends UnicastRemoteObject
                               implements ServiceRunner
{
    public Object executeService(Service t) {
        ...
    }
}
    使用元数据标签可以指示编译器产生必要的远程接口模板代码:
public class ServiceRunner {
    @Remote public Object executeService(Service t) {
        ...
    }
}
6.结束语
    正如你以上所见,Java1.5新版本将会是一个扩大的版本,尤其在语言方面改变很大。总体来说,这些新特性的引进增加了学习曲线的长度,但使得Java变得对程序员更加友好和易用。语言的改变扩大了Java对交叉语言开发者的影响,性能的增强使Java比以往任何时候运行更快。对XML及Web服务的关注使Java成为目前网络编程的一种典范语言,这个新版本Java1.5的发布将会使Java平台更加流行。
参考文献:
· JSR Documents
http://www.jcp.org/en/jsr
· Josh Bloch's article on New Language Features for Tiger:
http://java.sun.com/features/2003/05/bloch_qa.html

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。