`
empireghost
  • 浏览: 52437 次
  • 来自: ...
社区版块
存档分类
最新评论

JDK1.5、1.6新特性

阅读更多

Java2标准版(Java 2 Platform, Standard Edition, J2SE)1.5版本更新不同于以往,它带来了很多里程碑式的革新,SUN将其绰号取名为“虎”。这一次的变革将是Java诞生以来从未有过的,它给我们 带来了耳目一新的感觉。下面我们就来欣赏一下其中的部分典型变化:



比较JDK版本,JDK 1.5中新增的语言特性:

1.枚举(增加了一个关键字enum);

2.变参(方法参数数量可以不固定多少);

3.泛型;

4.自动拆装箱(基本类型与包装类型可以混用);

5.foreach循环(方法地用于遍历数组和集合);

6.静态导入(可以在使用静方法前不加类名);

7.注释(采用@前缀,这个基本上是为了简化J2EE而准备的,在JavaEE5中的EJB3、JPA等中随处可以看到它的身影)。

在JVM、基本类库、SDK工具和硬件平台支持上都有很多的提高,这个JDK版本的出现可以说是Java中的一次飞越。

具体的解释下:

1.自动包装和解包(Autoboxing and unboxing)   代码示例
  
  往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:
  
  List list = new ArrayList();
  
  list.add( new Integer( 10 ) );
  
  而在1.5版本中可以写为:
  
  list.add( 10 );
  
  因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入到一个ArrayList中 的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样的代码只是增加了程序的文本长度而已,所以1.5版本支持了自动包 装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int /Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,从而使代码变得简单。
  
  2.更优化的循环语句(The inhanced for loop)   代码示例
  
  一个典型的遍历数组的循环语句,1.5版本以前的写法是:
  
  for ( Iterator iterator = list.iterator(); iterator.hasNext(); )
  
  {
  
  Integer n = (Integer)iterator.next();
  
  ...
  
  }//for
  
  而在1.5版本中可以写为:
  
  for ( Integer n : list )
  
  {
  
  ...
  
  }//for
  
  显然1.5版本的写法比以前是大大简化了,但是在需要修改集合,比如删除其中元素时不能采用这种写法。之所以Java1.5版本没有象C#那 样干脆定义一个foreach关键词,主要是因为SUN认为增加一个专门的关键词成本太高了(too costly)。但1.4版本中就曾经增加了assert关键词,1.5版本中也新增加了enum关键词,因此这一解释恐怕并不那么令人信服。
  
  3.参数可变的方法和printf   代码示例
  
  当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,1.5版本以前的写法是:
  
  int sum(Integer[] numbers)
  
  {
  
  int nSum = 0;
  
  for(int i: numbers)
  
  nSum += i;
  
  return nSum;
  
  }
  
  ...
  
  //在别处调用该方法
  
  sum(new Integer[] {12,13,20});
  
  而在1.5版本中可以写为:
  
  int sum(Integer... numbers)
  
  {
  
  int nSum = 0;
  
  for(int i: numbers)
  
  nSum += i;
  
  return nSum;
  
  }
  
  ...
  
  //在别处调用该方法
  
  sum(12,13,20);
  
  显然,1.5版本的写法更为简易,也更为直观,尤其是方法的调用语句,不仅简化很多,而且更符合通常的思维方式,更易于理解。
  
  1.5版本自身就有一个应用该特征的典型例子,即C风格的格式化输出方法——printf。
  
  代码示例
  
  输出一个加法算式,1.5版本以前的写法是:
  
  int x = 5;
  
  int y = 7;
  
  int nSum = x + y;
  
  System.out.println(x + " + " + y + " = " + nSum);
  
  而在1.5版本中可以写为:
  
  System.out.printf("%d + %d = %d\n", x, y, nSum);
  
  以上两种写法的输出结构是一样的,即“5 + 7 = 12”。
  
  这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式输出,可以写为“System.out.printf("d + d = d\n", x, y, nSum);”,输出结果将是“05 + 07 = 12”。
  
  4.枚举   代码示例
  
  构建一个表示色彩的枚举,并赋值,在1.5版本中可以写为:
  
  public enum MyColor{ Red, Yellow, Blue }
  
  MyColor color = MyColor.Red;
  
  for ( MyColor mycolor : MyColor.values() )
  
  System.out.println( mycolor );
  
  以往的Java版本中没有enum关键词,1.5版本中终于加入了进来,这确实是一个令人高兴的改进。此外,enum还提供了一个名为 values()的静态方法,用以返回枚举的所有值的集合。所以,以上程序的输出结果是把“Red”、“Yellow”、“Blue”分行输出。
  
  而enum提供的静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值,比如 “MyColor.valueOf(“Red”)”会返回“Color.Red”。静态方法name()则返回某一个具体枚举元素的名字,比如 “MyColor.Red.name()”会返回“Red”。类似的方法还有不少。此外,enum自身还可以有构造方法。
  
  5.静态引用   代码示例
  
  当我们要获取一个随即数时,1.5版本以前的写法是:
  
  import java.lang.Math; //程序开头处
  
  ...
  
  double x = Math.random();
  
  而在1.5版本中可以写为:
  
  import static java.lang.Math.random; //程序开头处
  
  …
  
  double x = random();
  
  静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,只需写为“import static java.lang.Math.*”即可。这样的引用方式对于枚举也同样有效。







JDK1.6

简化Web Services Mustang 将 简化Web services 的开发和发布. XML和Web服务一直都是Mustang的关注重点.. Mustang为此引入了JAX-WS(Java Architecture for XML-Web Services) 2.0 以及JAXB(Java Architecture for XML Binding) 2.0.. 同时还有Streaming API for XML (STaX), 它提供了一个双向API,这个API可以通过一个事件流来读取或者写入XML,其中包括跳过某个部分,然后直接关注与文档中的另外一个小部分的能力。


Scripting,整合脚本语言 目前来讲,Java 开发者们必须在Java之外独立地额外编码来使用non-Java 脚本语言。这个头痛的问题将被Mustang 消灭,开发者将更加轻松的使用Perl、PHP、Python、JavaScript 和Ruby等脚本语言。新的框架将允许人们操作任意的脚本语言,和使用Java 对象。

Java SE6中实现了JSR223。 这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可 以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。另外,Web Scripting Framework允许脚本代码在任何的Servlet容器(例如Tomcat)中生成Web内容。

Database,绑定Derby 开源嵌入式数据库 Derby(JavaDB) 绑定在JDK 1.6中.具体可以参考:JDK 1.6 将绑定开源数据库 Derby

更丰富的Desktop APIs Mustang中拥有更多强的桌面API提供给开发者, 开发者可以更简单地开发更强大的桌面应用, 比如启动界面的支持,系统托盘的支持,JTable排序等等

监视和管理 Java SE 6中对内存泄漏增强了分析以及诊断能力。当遇到java.lang.OutOfMemory异常的时候,可以得到一个完整的堆栈信息,并且当堆已经满了的 时候,会产生一个Log文件来记录这个致命错误。另外,JVM还添加了一个选项,允许你在堆满的时候运行脚本。(这也就是提供了另外一种方法来诊断错误)

增强的JMX 监视API在MBean的属性值传入了一个特定的参数的时候,允许这个应用程序发送一个事件通告。(这里的属性值可以在很复杂的类型中)

对于Solaris 10的用户,为Solaris提供的Hotspot JVM中,提供了一种通过Solaris DTrace(这是个系统的调试工具)来追踪显示JVM内部的活动情况,包括垃圾收集,类装载,线程,锁等等。

Pluggable Annotations 从Java SE 5   带来得新特性Annotations,将在Mustang继续扮演重要角色..

Compiler API:访问编译器 对于Java开发工具, 或者Web框架 等的开发者来说, 利用编译器编译动态生成的代码, 是一个普遍的需求.

Mustang实现了JSR 199   提供了Java编译器API(应用程序接口),允许你从一个Java应用程序中去编译其他的Java源程序--比如在应用程序中动态生成的一些源代码..

Security:安全性 Java SE 6的安全部分,增加了 XML-Digital Signature (XML-DSIG) APIs, 整合了GSS/Kerberos的操作API,LDAP上的JAAS认证。

Instrumentation
      利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument、本地代码(native code)instrument,以及动态改变 classpath 等等。在 Java SE 5 当中,开发者只能在 premain 当中施展想象力,所作的 Instrumentation 也仅限与 main 函数执行前,这样的方式存在一定的局限性。在 Java SE 6 的 Instrumentation 当中,有一个跟 premain“并驾齐驱”的“agentmain”方法,可以在 main 函数开始运行之后再运行。

Http     在 Java SE 6 当中,围绕着 HTTP 协议出现了很多实用的新特性:NTLM 认证提供了一种 Window 平台下较为安全的认证机制;JDK 当中提供了一个轻量级的 HTTP 服务器;提供了较为完善的 HTTP Cookie 管理功能;更为实用的 NetworkInterface;DNS 域名的国际化支持等等。
    HTTP Cookie管理可以应用客户操作临时变量的保存,如查询条件,当前状态等


JMX与系统管理
管理系统的构架
图 1. 管理系统构架




上图分析了管理系统的基本构架模式。其中 Agent / SubAgent 起到的就是翻译的作用:把 IT 资源报告的消息以管理系统能理解的方式传送出去。

也许读者有会问,为什么需要 Agent 和 SubAgent 两层体系呢?这里有两个现实的原因:

管理系统一般是一个中央控制的控制软件,而 SubAgent 直接监控一些资源,往往和这些资源分布在同一物理位置。当这些 SubAgent 把状态信息传输到管理系统或者传达管理系统的控制指令的时候,需要提供一些网络传输的功能。

管理系统的消息是有一定规范的,消息的翻译本身是件复杂而枯燥的事情。
一般来说,管理系统会将同一物理分布或者功能类似的 SubAgent 分组成一组,由一个共用的 Agent 加以管理。在这个 Agent 里封装了 1 和 2 的功能。

JMX 和管理系统
JMX 既是 Java 管理系统的一个标准,一个规范,也是一个接口,一个框架。图 2 展示了 JMX 的基本架构。
图 2. JMX 构架和其它的资源系统一样,JMX 是管理系统和资源之间的一个接口,它定义了管理系统和资源之间交互的标准。javax.management.MBeanServer 实现了 Agent 的功能,以标准的方式给出了管理系统访问 JMX 框架的接口。而 javax.management.MBeans 实现了 SubAgent 的功能,以标准的方式给出了 JMX 框架访问资源的接口。而从类库的层次上看,JMX 包括了核心类库 java.lang.management 和 javax.management包。java.lang.management 包提供了基本的 VM 监控功能,而 javax.management 包则向用户提供了扩展功能。 JMX帮助开发者监控JVM的信息。

编辑器API      JDK 6 提供了在运行时调用编译器的 API。在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤:

分析 JSP 代码;
生成 Java 代码;
将 Java 代码写入存储器;
启动另外一个进程并运行编译器编译 Java 代码;
将类文件写入存储器;
服务器读入类文件并运行;
     但如果采用运行时编译,可以同时简化步骤 4 和 5,节约新进程的开销和写入存储器的输出开销,提高系统效率。实际上,在 JDK 5 中,Sun 也提供了调用编译器的编程接口。然而不同的是,老版本的编程接口并不是标准 API 的一部分,而是作为 Sun 的专有实现提供的,而新版则带来了标准化的优点。
     新 API 的第二个新特性是可以编译抽象文件,理论上是任何形式的对象 —— 只要该对象实现了特定的接口。有了这个特性,上述例子中的步骤 3 也可以省略。整个 JSP 的编译运行在一个进程中完成,同时消除额外的输入输出操作。
     第三个新特性是可以收集编译时的诊断信息。作为对前两个新特性的补充,它可以使开发人员轻松的输出必要的编译错误或者是警告信息,从而省去了很多重定向的麻烦

一些有趣的新特性:

1 本地行为 java.awt.Desktop 比如用默认程序打开文件,用默认浏览器打开url,再也不用那个browserlauncher那么费劲

Desktop desk=Desktop.getDesktop();
desk.browse(new URI("http://www.google.com/"));
desk.open(file)
desk.print(file)

2 console下密码输入 java.io.Console
再也不用自己写线程去删echo字符了
Console console = System.console();
char password[] = console.readPassword("Enter password: ");

3 获取磁盘空间大小 java.io.File的新方法 File roots[] = File.listRoots();
for (File root : roots) {
System.out.println(root.getPath()+":"+root.getUsableSpace()
+"/"+root.getTotalSpace());
}

4 专利过期,可以提供合法的lzw的gif encoder了
ImageIO.write(input, "GIF", outputFile);

5 JAXB2.0 增加了java-to-xml schema,完成java bean,xml间转换非常容易
6 xml数字签名 javax.xml.crypto,记得以前似乎只有ibm有个类库实现了
7 编译器 ,以前是com.sun.tools.javac,现在是javax.tools.JavaCompiler
有人写了完全在内存里的生成源文件,编译,反射运行的过程,比较好玩。

8 脚本引擎 ,javax.script,内嵌的是Mozilla Rhino1.6r2 支持ECMAScript1.6

分享到:
评论

相关推荐

    jdk1.5 jdk1.6 反编译 工具

    标题中的“jdk1.5 jdk1.6 反编译 工具”指的是用于对Java字节码进行反编译的软件,这类工具能够将Java的.class文件转换回可读的.java源代码形式,这对于理解和学习已有的Java类库或者进行逆向工程非常有帮助。...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    JDK 1.5在2004年发布,引入了许多重要的新特性,如: 1. **Generics(泛型)**:泛型允许在定义类、接口和方法时指定类型参数,提高了代码的类型安全性和重用性。 2. **Autoboxing/Unboxing(自动装箱/拆箱)**:...

    JDK1.5JDK1.6各自的新特性

    JDK1.5JDK1.6各自的新特性

    最新最全最好用的JDK1.5/5.0/1.6中文版(全译)下载地址

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要提供了JDK 1.5/5.0/1.6三个版本的中文文档下载链接。这些文档以CHM格式提供,分别对应不同版本的JDK,并且是经过完整翻译的中文版。下面我们将...

    jdk1.5 1.6 1.7的新特征总结

    【JDK1.5新特性】 1. 泛型(Generic) JDK1.5引入了泛型,这是对类型安全的重要改进。泛型允许在集合类中指定元素的类型,确保了在编译时就能进行类型检查,避免了运行时的强制类型转换和可能的ClassCastException...

    JDK1.4,1.5,1.6的区别

    #### JDK1.5 新特性 JDK1.5,也称为Java 5,是Java发展史上的一个重要里程碑,引入了许多新特性,极大地提高了开发效率和代码质量。这些新特性包括: 1. **泛型** - 泛型是一种在编译时检查类型安全,并且所有的...

    Oracle 11g jar包--支持jdk1.5 1.6

    由于JDK的版本更新通常会带来一些新的特性和性能提升,因此使用与JDK版本相匹配的驱动可以充分利用这些改进,确保应用程序的稳定性和效率。 在实际开发中,引入这些jar文件的方法通常是将其添加到项目的类路径中,...

    JDK1.5和1.6新增特性[借鉴].pdf

    在JDK 1.5和1.6这两个版本中,Java语言引入了一系列重大特性,极大地提高了开发效率和代码质量。这些特性使得Java更加现代化,更适应面向对象编程的需求。以下是这些特性的详细介绍: 1. 泛型(Generic):泛型是...

    jxl.jar与jdk1.5和jxl.jar与jdk1.6匹配

    例如,JDK1.5引入了泛型和枚举等新特性,JDK1.6则增强了并发处理和内存管理,这些变化可能会对jxl.jar的运行产生微妙的影响。 在JDK1.5环境下,jxl.jar通常能够正常工作,因为它的设计兼容了Java 1.3及更高版本。...

    jdk 1.5:1.6:1.7.zip

    JDK 1.5在2004年发布,引入了许多重要的新特性和改进,其中最显著的是: 1. **泛型**:泛型增加了类型安全,允许在编译时检查类型,避免了运行时的ClassCastException。 2. **枚举类型**:这是一种新的数据类型,...

    jdk1.5、1.6压缩包

    JDK 1.5(2004年发布)是Java发展的一个重要里程碑,引入了许多新特性,极大地提升了开发效率和代码质量。以下是一些关键的更新: 1. **泛型**:泛型允许在类、接口和方法中使用类型参数,增强了类型安全,减少了...

    JDK1.5-1.6-1.7新特性

    在Java的JDK 1.5到1.7版本中,引入了一系列的新特性,极大地提升了开发效率和代码的可读性。以下是对这些新特性的详细介绍: 1. **自动装箱与拆箱**: 自动装箱允许基本类型与对应的包装类之间进行无缝转换。在JDK...

    java JDK1.5,1.6版本,和安装

    JDK1.5,也被称为Java SE 5.0,引入了许多重要的新特性,包括: 1. **泛型**:泛型允许在定义类、接口和方法时指定类型参数,提高了代码的类型安全性,减少了类型转换的需要。 2. **枚举类型**:作为预定义常量的...

    jdk1.5/1.6/1.7新特性

    ### JDK 1.5、1.6 和 1.7 的新特性详解 #### JDK 1.5 新特性概述 1. **自动装箱与拆箱:** - 自动装箱指的是将基本数据类型自动转换为对应的包装类对象的过程。 - 例如:`Integer iObj = 3;` 这里将整型 `3` ...

    jdk1.5/1.6合集

    Java开发工具合集,主要包含了JDK 1.5和JDK 1.6两个版本,这是Java编程语言历史上非常重要的两个里程碑。JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的核心工具集,对于Java开发者来...

    JDK1.5-1.6-1.7之新特性总结-1

    在Java的发展历程中,JDK 1.5到1.7版本引入了许多重要的新特性,极大地提升了开发效率和代码质量。下面将详细讲解这些版本中的关键特性。 **1. 自动装箱与拆箱** 自动装箱是JDK 1.5引入的一个重要特性,它使得基本...

    jdk1.5 windows 64位官方正式版

    1. **泛型(Generics)**:泛型是JDK 1.5最显著的新特性之一,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和重用性。这减少了在运行时可能遇到的ClassCastException。 2. **自动装箱/拆箱...

Global site tag (gtag.js) - Google Analytics