jdk 1.6 新特性(zz)

来源:互联网 发布:长笛演奏实用教程 淘宝 编辑:程序博客网 时间:2024/06/04 18:05

一:Desktop类和SystemTray类

在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray。

前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,

用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机

打印文档;后者可以用来在系统托盘区创建一个托盘程序.

二:使用JAXB2来实现对象与XML之间的映射

JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反

之亦然。

我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM

(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这

也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来,JAXB2(JSR 222)用

JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。

实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2

在底层是用StAX(JSR 173)来处理XML文档。除了JAXB之外,我们还可以通过XMLBeans和Castor等

来实现同样的功能。

三:理解StAX

StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API。

StAX 的来历 :在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和

SAX(Simple API for XML).

由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAX所以Sun决定把StAX加入到

JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本). JDK6里面JAXP的版

本就是1.4. 。

StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的

API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍

历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使

解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直

到碰到文档结束符;
SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析

事件,然后推给程序去处理这些事件;DOM 采用的方式是将整个xml文档映射到一颗内存树,这样

就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能

四:使用Compiler API

现在我 们可以用JDK6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler API结合反射

功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。

这个特性对于某些需要用到动态编译的应用程序相当有用, 比如JSP Web Server,当我们手动修

改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来

实现动态编译JSP文件,当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web

Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这种方式需

要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;

Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。

五:轻量级Http Server API

JDK6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持

Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http

Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类

的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成

HttpExchange类,HttpServer负责将HttpExchange传给 HttpHandler实现类的回调方法.

六:插入式注解处理API(Pluggable Annotation Processing API)

插入式注解处理API(JSR 269)提供一套标准API来处理Annotations(JSR 175)

实际上JSR 269不仅仅用来处理Annotation,我觉得更强大的功能是它建立了Java 语言本身的一个

模型,它把method, package, constructor, type, variable, enum, annotation等Java语言元素

映射为Types和Elements(两者有什么区别?), 从而将Java语言的语义映射成为对象, 我们可以在

javax.lang.model包下面可以看到这些类. 所以我们可以利用JSR 269提供的API来构建一个功能

丰富的元编程(metaprogramming)环境.

JSR 269用Annotation Processor在编译期间而不是运行期间处理Annotation, Annotation

Processor相当于编译器的一个插件,所以称为插入式注解处理.如果Annotation Processor处理

Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation

Processor,如果第二次处理还有新代码产生,就会接着调用Annotation Processor,直到没有新代

码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation processing过程

可以看作是一个round的序列.

JSR 269主要被设计成为针对Tools或者容器的API. 举个例子,我们想建立一套基于Annotation的

单元测试框架(如TestNG),在测试类里面用Annotation来标识测试期间需要执行的测试方法。

七:用Console开发控制台程序

JDK6中提供了java.io.Console 类专用来访问基于字符的控制台设备. 你的程序如果要与Windows

下的cmd或者Linux下的Terminal交互,就可以用Console类代劳. 但我们不总是能得到可用的

Console, 一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用. 如果JVM是在交互式命

令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个

可用的Console实例.

八:对脚本语言的支持如: ruby, groovy, javascript.

九:Common Annotations

Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了

Java SE 6.0中.
随着Annotation元数据功能(JSR 175)加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web

Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB

的声明式事务), 如果这些技术为通用目的都单独定义了自己的Annotations,显然有点重复建设,

所以,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,

也保证Java SE和Java EE 各种技术的一致性.

下面列举出Common Annotations 1.0里面的10个Annotations Common Annotations
Annotation Retention Target Description
Generated Source ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD,

PACKAGE, PARAMETER, TYPE 用于标注生成的源代码
Resource Runtime TYPE, METHOD, FIELD 用于标注所依赖的资源,容器据此注入外部资源依赖,

有基于字段的注入和基于setter方法的注入两种方式
Resources Runtime TYPE 同时标注多个外部依赖,容器会把所有这些外部依赖注入
PostConstruct Runtime METHOD 标注当容器注入所有依赖之后运行的方法,用来进行依赖注入后

的初始化工作,只有一个方法可以标注为PostConstruct
PreDestroy Runtime METHOD 当对象实例将要被从容器当中删掉之前,要执行的回调方法要标注

为PreDestroy RunAs Runtime TYPE 用于标注用什么安全角色来执行被标注类的方法,这个安全

角色必须和Container 的Security角色一致的。RolesAllowed Runtime TYPE, METHOD 用于标注

允许执行被标注类或方法的安全角色,这个安全角色必须和Container 的Security角色一致的
PermitAll Runtime TYPE, METHOD 允许所有角色执行被标注的类或方法
DenyAll Runtime TYPE, METHOD 不允许任何角色执行被标注的类或方法,表明该类或方法不能在

Java EE容器里面运行
DeclareRoles Runtime TYPE 用来定义可以被应用程序检验的安全角色,通常用isUserInRole来

检验安全角色

注意:
1.RolesAllowed,PermitAll,DenyAll不能同时应用到一个类或方法上

2.标注在方法上的RolesAllowed,PermitAll,DenyAll会覆盖标注在类上的

RolesAllowed,PermitAll,DenyAll

3.RunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles还没有加到Java SE 6.0上来

4. 处理以上Annotations的工作是由Java EE容器来做, Java SE 6.0只是包含了上面表格的前五

种Annotations的定义类,并没有包含处理这些Annotations的引擎,这个工作可以由Pluggable

Annotation Processing API(JSR 269)来做

改动的地方最大的就是java GUI界面的显示了,JDK6.0(也就是JDK1.6)支持最新的windows

vista系统的Windows Aero视窗效果,而JDK1.5不支持!!!
你要在vista环境下编程的话最好装jdk6.0,否则它总是换到windows basic视窗效果.







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 把状态信息传输到管理系统或者传达管理系统的控制指令的时候,需要提供一些网络传输的功能。 
  1. 管理系统的消息是有一定规范的,消息的翻译本身是件复杂而枯燥的事情。 
  一般来说,管理系统会将同一物理分布或者功能类似的 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 个步骤: 
  1. 分析 JSP 代码; 
  2. 生成 Java 代码; 
  3. 将 Java 代码写入存储器; 
  4. 启动另外一个进程并运行编译器编译 Java 代码; 
  5. 将类文件写入存储器; 
  6. 服务器读入类文件并运行; 
  但如果采用运行时编译,可以同时简化步骤 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