站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题“老虎”来了 J2SE1.5(代号:Tiger)新功能一览

“老虎”来了 J2SE1.5(代号:Tiger)新功能一览

摘要: “老虎”来了 J2SE1.5(代号:Tiger)新功能一览

在这个版本中有这么多令人激动的改变,也许您想尽快了解并使用这些新功能,那么来吧,本文将向你介绍这些重大的修订,这样就可以在深入学习API文档之前对J2SE 1.5有一个大体的了解。

  阅读导航

   易开发性
   J2SE1.5 Beta2发布了,Sun在这个版本中对Java语言做了重大修正;这些修正包括泛型、元数据、自动包装、增强的"for"循环、枚举类型、静态导入、类似C语言的格式输入/输出、可变参数、并发程序和更简单的RMI接口。 

   可扩展性和性能
   Sun承诺在1.5版中对可扩缩性和性能方面进行改善,它着重于启动时间和内存大小,使得高速部署应用程序变得更加容易。 

   监控和可管理性
   J2SE 1.5版提供广泛的监控和管理支持:遵守Java虚拟机的实现方法,Java管理扩展( JMX)框架和远程访问协议。

   桌面客户端
   Java桌面客户端保留了Java平台的一个关键组成部分,并且这一点成了 J2SE 1.5 中许多改进的焦点。

   其他特性
   J2SE1.5还引入了几个核心XML平台的修订版以及32位的辅助字符和新的JDBC RowSet,极大的提高了数据库应用程序的开发效率。

<table cellspacing="0" cellpadding="0" width="776" border="0"> <tr> <td valign="top" bgcolor="#f0f2fb"> <table cellspacing="0" cellpadding="0" width="590" align="center" border="0"> <tr> <td>简化开发

  J2SE1.5 Beta2发布了,Sun在这个版本中对Java语言做了重大修正;这些修订包括泛型、元数据、自动包装、增强的"for"循环、枚举类型、静态导入、类似C语言的格式输入/输出、可变参数、并发程序和更简单的RMI接口。JSR - 201包含四个语言修改;增强的循环、枚举类型、静态导入和自动包装;JSR - 175指定了新的元数据函数、而JSR - 14描述了泛型。

  新的默认语言规范是由1.5版javac编译程序实现的,你不需要像在beta1版中那样提供-source 1.5这个选项。

  元数据

  J2SE 1.5 中的元数据特性提供这样的能力,即向 Java 类、接口、方法和字段关联附加的数据。这些附加的数据或者注释,可以被 javac 编译器或其他工具读取,并且根据不同配置,可以被保存在类文件中,也可以在运行时用 Java 反射 API 发现。

  添加元数据到Java平台中的最主要的原因是能够使开发工具和运行工具有一个共同的体系结构,以减少编程和部署所需要的成本。工具可以使用元数据信息生成附加的源代码,或者在调试的时候提供附加信息。

  在beta2中,我们很高兴地发现了一个名为apt的注释处理工具。 Apt包括一组新的映射应用程序编程接口和工作程序注解的支持体系结构。apt在映射应用程序编程接口时提供一个构造期间、基于源代码的程序结构的只读视图,来清晰地模拟它的Java程序语言的类型系统。首先,apt运行可以生成新的源代码和其它文件的注释处理程序。其次,apt可以编译原始的源文件和生成的源程序,简化了开发。更多的关于apt的信息,请参考apt指南http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html。

  下面的例子用元数据工具创建了一个调试元数据注释,然后这些元数据注释在运行时显示出来。可以想像,大部分的元数据标签形成一个标准,即一个良好规范的集合。

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug
{
 boolean devbuild() default false;
 int counter();
}
public class MetaTest
{
 final boolean production=true;
 @debug(devbuild=production,counter=1)
 public void testMethod() { }
 public static void main(String[] args)
 {
  MetaTest mt = new MetaTest();
  try
  {
   Annotation[] a = mt.getClass().getMethod("testMethod").getAnnotations();
   for (int i=0; i<a.length ; i++)
   {
    System.out.println("a["+i+"]="+a[i]+" ");
   }
  }
  catch(NoSuchMethodException e)
  {
   System.out.println(e);
  }
 }
}</td> </tr> </table>
  使用元数据处理工具,许多重复的代码步骤可以被简化为一个简明的元数据标签。例如,当访问一个JAX-RPC服务实现的时候,所需得远程接口可以如下面的代码这样实现:

  J2SE1.5版以前

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>public interface PingIF extends Remote
{
 public void ping() throws RemoteException;
}
public class Ping implements PingIF
{
 public void ping() { }
}</td> </tr> </table>
  J2SE1.5

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>public class Ping
{
 public @remote void ping() { }
}</td> </tr> </table>
  泛型

  泛型已经为Java社团所广泛期待,现在成了J2SE 1.5版的一个组成部分。最先能看到泛型起作用的地方就是Collection API。Collection API提供了像LinkedLists, ArrayLists 和 HashMaps这样的函数,可以被不止一种的Java类型使用。接下来的示例中使用了1.4.2库和默认的javac编译方式。

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();</td> </tr> </table>
  最后一行中的 Integer 转换是泛型所要防止的强制类型转换问题的一个例子。问题是1.4.2版本中,Collection API使用Object类来保存Collection对象,这意味着在编译时不能找出任何类型匹配。问题的第一个标志信息是在运行时抛出的 ClassCastException。

  使用泛型化的Collection库编写的相同示例如下:

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0).intValue();</td> </tr> </table>
  使用泛型应用编程接口的用户必须只使用<>符号声明在编译类型中使用的类型,不需要进行任何类型强制转换,在本例中试图向Integer集合中添加一个String对象到的操作将会在编译时被捕获。

  泛型允许 API 设计者提供这样的公共功能性:可以与多种数据类型一起使用,也可以在编译时出于类型安全对它进行检查。

  设计你们自己泛型应用程序编程接口比仅仅使用它们要复杂一些。你可以参考java.util.Collection源程序和应用编程接口指南来实现。

  基本类型的自动装箱和拆箱(Autoboxing 和 Auto-unboxing)

  象int、boolean和它们的相对应的基于Object的相应物如Integer和Boolean这样的基本数据类型互相间进行转换时,需要大量不必要的额外编码,尤其是当只是像 Collections API 这样的方法调用需要转换时更甚。

  Java基本类型的autoboxing 和 auto-unboxing 产生更加简明和易用的代码。1.5 版本让所需要的转换转变成 Integer 并转换回编译器。

  1.5版前

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = (list.get(0)).intValue();</td> </tr> </table>
  1.5版

<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"> <tr> <td>ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);</td> </tr> </table>

</td> </tr> </table> </td> </tr> <tr> <td valign="top" bgcolor="#f0f2fb" height="10"></td> </tr> <tr> <td valign="top" background="/newimages/newhard/newhard-040906_c_1.gif" bgcolor="#f0f2fb" height="1"></td> </tr> <tr> <td valign="top" bgcolor="#dee2f5"> <table height="25" cellspacing="0" cellpadding="0" width="590" align="center" border="0"> <tr> <td width="90"></td> </tr> </table> </td> </tr> </table>

 




↑返回目录
前一篇: 浅析J2EE、J2SE和J2ME
后一篇: Eclipse3.1中体验J2SE5.0之泛型