jdk6新特性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JDK6.0(Mustang)
综述
✓2006 年底,Sun 公司发布了Java Standard
Edition 6(Java SE 6)的最终正式版,代号Mustang(野马)
✓跟Tiger(Java SE 5)相比,在性能方面有了不错
的提升,但在API 库方面的新特性略少
✓提供了许多实用和方便的功能:脚本,Web service,XML,编译器API,数据库,JMX,网络和Instrumentation 方面都有不错的新特性和功能加强
✓下面列举了一些主要的特性:
◆Web Services
◆Scripting
◆Database
◆More Desktop APIs
◆Monitoring and Management ◆Compiler Access
◆Pluggable Annotations
◆Network
◆Console
Web Services and XML
Common Annotations
JAXB2
StAX
Web Services metadata
Common Annotations
✓Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中
✓为其他相关的Java技术定义一套公共Annotation,避免重复建设,保证Java SE和Java EE 各种技术的一致性
随着Annotation元数据功能(JSR 175) 加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务), 如果这些技术为通用目的都单独定义了自己的Annotations,显然有点重复建设
这些注解在javax.annotation 包中,共有五个注解,下面给出了列举: Annotation Retention Target Description
Generated SOURCE PACKAGE,
用于标记已生成的源代码
TYPE,
ANNOTATION_TY
PE,
METHOD,
CONSTRUCTOR,
FIELD,
LOCAL_VARIABLE,
PARAMETER
PostConstruct RUNTIME METHOD用于在依赖关系注入完成之后需要执
行的方法上,以执行任何初始化
PreDestroy RUNTIME METHOD作为回调通知用于各方法,以表示该
实例正处于被容器移除的过程中
Resource RUNTIME TYPE,FIELD,
标记应用程序所需的资源
METHOD
Resources RUNTIME TYPE 用于允许多个资源声明
JAXB2
✓原来JAXB是Java EE的一部分,在JDK6中,SUN 将其放到了Java SE中
✓JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然✓比起1.0版本(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,极大简化了开发的工作量
✓JAXB2在底层用StAX(JSR 173)来处理XML文档
主要处理类在javax.xml.bind包中,如下:
JAXBContext提供到JAXB API 的客户端入口点。
它提供了管理
实现JAXB 绑定框架操作所需的XML/Java 绑定信
息的抽象,这些操作包括:解组、编组和验证Marshaller 负责管理将Java 内容树序列化回XML 数据的过
程。
它提供了基本的编组方法Unmarshaller 管理将XML 数据反序列化为新创建的Java 内容
树的过程,并可在解组时有选择地验证XML 数据。
它针对各种不同的输入种类提供各种重载的
unmarshal 方法
主要注解类在javax.xml.bind.annotation包中
定义了将Java 程序元素定制成XML 模式映射的注释,主要如下:
Annotation Retention Target Description XmlRootElement RUNTIME TYPE将类或枚举类型映射到
XML 元素
XmlElement RUNTIME FIELD,
METHOD 将JavaBean 属性映射到派生于属性名称的XML 元素
XmlAttribute RUNTIME FIELD,
METHOD 将JavaBean 属性映射到XML 属性
StAX
✓StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API
✓StAX通过提供一种基于事件迭代器(Iterator)的API 让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符✓SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件
javax.xml.stream包中,主要接口见下图: 处理类主要在
接口描述
XMLEventReader此类是用于解析XML 事件的顶层接口
XMLEventWriter此类是用于编写XML 文档的顶层接口
XMLStreamReader XMLStreamReader 接口允许转发XML 和
对XML 的只读访问
XMLStreamWriter XMLStreamWriter 接口指定如何编写XML
Web Services metadata
✓用元数据功能来标注要暴露成Web Service的方法✓是一组元数据,在javax.jws包中,下表列举了这些
metadata
Annotation Retention Target Description
HandlerChain RUNTIME TYPE,
METHOD,
FIELD 将Web Service 与外部定义的处理程序链关联
Oneway RUNTIME METHOD指示给定@WebMethod 只有
一条输入消息并且没有输出WebMethod RUNTIME METHOD定制一个公开为Web Service
操作的方法
WebParam RUNTIME PARAMETER定制单个参数到Web Service
消息部分和XML 元素的映射关
系
WebResult RUNTIME METHOD定制返回值到WSDL 部分和
XML 元素的映射关系WebService RUNTIME TYPE 将Java 类标记为实现Web
Service,或者将Java 接口标
记为定义Web Service 接口
测试和发布
JDK6提供了一个很简单的机制可以用来测试和发布Web Services,步骤如下:
a)将<JAVA_HOME>/bin加入path环境变量
b)在命令行下切换当前目录到项目的class文件所在的目录,运行下面命令
wsgen -cp . WebServices.WSProvider
在这个例子中会生成以下3个类的源代码文件及class文件
SayHi SayHiResponse PrintTime
c)执行如下代码:
Endpoint.publish("http://localhost:8888/welcome/WSProvider",new WSProvider());
就可以将WSProvider发布到
http://localhost:8888/welcome/WSProvider
a)在浏览器输入http://localhost:8888/welcome/WSProvider?wsdl就可以
看到生成的WSDL文件
Scripting
✓JDK6增加了对脚本语言的支持(JSR 223)✓对脚本的好处:
◆将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等
◆由于编译成bytecode后再执行,所以比原来边解释边执行效率要高很多
✓对Java语言也提供了以下好处:
◆脚本语言不需要用一个变量之前先声明它,可以用
一个变量存放完全不同类型的对象,不需要做强制类型转换,因为转换都是自动的, Java语言可以通过对脚本语言的支持间接获得这种灵活性
◆可以用脚本语言快速开发产品原型
◆通过引入脚本语言可以轻松实现Java应用程序的扩
展和自定义,可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。
可扩展性
Sun的JDK6实现包含了一个基于Mozilla Rhino的脚本语言引擎,支持JavaScript
可以通过实现如下两个接口来实现对其他脚本的支持:
javax.script.ScriptEngine
javax.script.ScriptEngineFactory
可以将实现ScriptEngine改为继承自AbstractScriptEngine
Scripting API
Scripting API是用于在Java里面编写脚本语言程序的API, 在Javax.script包中, 这个包里面有一个ScriptEngineManager类, 它是使用Scripting API的入口,ScriptEngineManager 可以通过jar服务发现(service discovery)机制寻找合适的脚本引擎类(ScriptEngine) ,可以利用Scripting API实现以下功能:
a)暴露Java对象为脚本语言的全局变量
b)在Java中调用脚本语言的方法
c)脚本语言可以实现Java的接口
d)脚本语言可以像Java一样使用JDK平台下的
类
✓Scripting Tool
◆SUN提供的JDK6中有一个命令行工具:jrunscript,可以在<JAVA_HOME>/bin下面找到这个工具
◆jrunscript是一个脚本语言的解释程序,它独立于脚本语言,但默认是用JavaScript,可以用jrunscript来测试自己写的脚本语言是否正确
◆下面是一个简单例子:
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>
Database
数据库Derby
JDBC4.0
数据库Derby
✓Derby是由IBM捐献Apache的DB项目的一个纯Java数据库,JDK6.0里的Derby的版本是10.2.1.7
✓支持关系数据库中的所有企业级的特性,包括崩溃恢复、事务回滚和提交、行/表级锁、视图、主键/外键约束、触发器、子查询表达式,等等
✓JDK6里的Derby支持JDBC 4.0规范
✓安装JDK6.0后,Derby会被安装到
%JAVA_HOME%/db里面
✓Derby有两种运行模式,一种是作为嵌入式模式,另一种是作为网络服务器模式
✓嵌入式模式(Embedded Framework)
◆Derby 嵌入到Java程序中运行. 当程序装载
本地JDBC驱动的时候启动Derby的引擎. 当程序终止的时候, 关闭Derby的引擎. 在同一时刻一个应用程序只能存取一个数据库.
◆以嵌入式数据库集成到应用程序中,只需要
将derby.jar放入到项目的classpath中就行
✓网络服务器模式(Server Framework)
◆是一个一直运行着的Java应用程序,允许多重,远程的
JDBC 应用程序连接到Derby.
◆以网络数据库形式集成到应用程序中,只需将derby自带
的derbynet.jar,derbyclient.jar或者使用IBM 提供的DB2 JDBC Universal Driver:db2jcc.jar,db2jcc_license_c.jar 放入到项目的classpath中。
启动网络数据库有如下两种方式:
a)在系统命令行中输入
Java workServerControl start
a)双击
C:\Java\jdk1.6.0_01\db\frameworks\NetworkServer\bin目录下的startNetworkServer.bat
✓使用Derby
◆Derby 提供了一个称为ij 的命令行工具
◆它是interactive JDBC scripting tool的缩写, 使用该工具能
够连接和操纵Derby数据库.
◆在使用该工具之前必须把下面的jar文件放到classpath中:
derby.jar 包含了JDBC驱动
derbytools.jar 包含了ij 工具
◆配置完classpath后, 打开ij 并且连接到Derby自带的样
例数据库toursdb:
c:\>java org.apache.derby.tools.ij
ij version 10.2
ij> connect
‘jdbc:derby:C:\Java\jdk1.6.0_01\db\demo\databases\toursdb’;
ij>
◆打开连接后即可输入各种sql语言进行数据
操作
✓关于Derby更详细的资料可以参见如下网页: a)/derby/docs/10.2/ref/ref-
single.html
b)/developerworks/cn/views/op
ensource/tutorials.jsp?cv_doc_id=102957
JDBC4.0
自动装载JDBC drivers
SQLExceptions
数据类型支持
API 的变化
自动装载JDBC drivers
✓在先前的版本里JDBC 4.0, 客户端应用程序需要装载驱动类:
Class.forName(“org.apache.derby.jdbc.ClientDriver”);✓在新版本中需要数据库提供商标记驱动类在jar中的META-INF.services\java.sql.Driver文件中
✓在这个文本文件中定义了一行实现了java.sql.Driver 接口的类,DriverManager为您提供了注册的处理✓只需要数据库URL, 用户名, 密码通过DriverManager的getConnection方法即可与数据库取得连接
异常处理
✓增加了一些简单而有力的异常处理机制, 其中值得一提的是链式异常,如果这个异常链存在的话,即可应用增强了的for-each 循环来获取异常链
✓SQLException 的子类
java.sql.SQLClientInfoException
java.sql.SQLDataException
java.sql.SQLFeatureNotSupportedException
java.sql.SQLIntegrityConstraintViolationException
java.sql.SQLInvalidAuthorizationSpecException
java.sql.SQLSyntaxErrorException
java.sql.SQLTransactionRollbackException
java.sql.SQLTransientConnectionException
数据类型支持
SQLXML
SQLXML 是新增的一个接口,是SQL 中XML 数据类型在Java中的表示,XML 是SQL 中用于表示表中XML数据的内建数据类型. 在默认的情况下,JDBC 驱动将SQLXML 指针指向XML 数据而不是数据本身. SQLXML 对象在其被创建的事务中是稳定的
✓ROWID 数据类型
SQL ROWID 唯一标识了数据表中的一行,并是访问该行的最快的方法,本版增加了RowId 接口以提供对ROWID SQL 数据类型在Java 类中的支持.
✓对大对象类型支持的增强
JDBC 版本2 提供了对大的SQL 对象如:CLOB , BLOB , ARRAY 的支持, 及用于添加相关接口的Struct: Clob , Blob , Array , and Struct . 在本版的JDBC 中增加了很多对这些对象访问的新方法.
API 的变化
✓Array
Array 接口增加了一个free 方法来释放array 对象及其持有的资源.
✓Connection 和PooledConnection
Connection 接口现在提供一系列创建大对象的方法如
createClob , createBlob 等等. 此外还有getter 和setter 对客户端信息的重载方法, 及验证当前连接正确性的方法.
PooledConnection 接口当前提供
addStatementEventListener 和
removeStatementEventListener 两个方法来注册和注销
StatementEventListener 接口, 这个接口是在本版JDBC 中新引入的. 这个接口的一个实例将获取到S tatement 池中PreparedStatement s 的变化. 比如,在注册以后, 当驱动调用statementClosed 方法时,所有StatementEventListener 将获得statement 已关闭的通知.
More Desktop APIs
Desktop类
SystemTray类
JTable的排序和过滤
Desktop类
✓Desktop 类允许Java 应用程序启动已在本机桌面上注册的关联应用程序,以处理URI 或文件。
✓支持的操作包括:
a)启动用户默认浏览器来显示指定的URI
b)启动带有可选mailto URI 的用户默认邮件客户端
c)启动已注册的应用程序,以打开、编辑或打印指定的文件
✓此类提供与这些操作对应的方法。
这些方法查找在当前平台上注册的关联应用程序,并启动该应用程序来处理URI 或文件。
如果没有关联应用程序或关联应用程序无法启动,则抛出异常。
✓应用程序被注册为URI 或文件类型, 注册, 访问和启动关联应用程序的机制与平台有关。
✓每个操作都是由Desktop.Action类表示的一种动作类型。
SystemTray类
✓SystemTray 类表示桌面的系统托盘。
在windows 上,它被称为“任务栏状态区域”,在Gnome 上,它被称为“通知区域”,在KDE 上,它被成为“系统托盘”
✓系统托盘由运行在桌面上的所有应用程序共
享
✓在某些平台上,可能不存在或不支持系统托盘,在这种情况下,getSystemTray()将抛出UnsupportedOperationException, 要检查系
统托盘是否受支持,可以使用isSupported()
每个Java 应用程序都有一个SystemTray 实例,在应用程序运行时,它允许应用程序与桌面系统托盘建立连接,SystemTray 实例可以通过getSystemTray()方法获得, 应用程序不能创建自己的SystemTray 实例
JTable的排序和过滤
新添加了javax.swing.table包中的TableRowSorter 类与javax.swing 包中的RowFilter<M,I>类分别用来实现表格的排序与过滤
Jconsole
Jconsole
✓Java SE 平台提供了一个图形化的监视工具,称为Jconsole,实现了JMX API,使你能够监视java虚拟机以及任何应用程序的性能,由
jdk5.0引入, 在jdk6中成为正式支持的特性之一✓一些增强如下:
a)JConsole Plugin 支持, 允许你构建自己的插件在JConsole 中运行
例如: 添加一个定制标签来存取你的应用程序的MBeans
b)动态绑定能力,允许将JConsole 连接到任何支持dynamic Attach API 的应用程序
c)增强的用户界面使得数据更加容易存取
d)新的”概述”和”VM摘要”标签,更好的表示关于你的JVM的一般信息
e)热诊断MBean, 提供API在运行时请求堆内存并且能够改变一些VM选项的设置
f)改良的MBeans表现, 使得更加容易的存取MBeans 的方法和属性
Compiler Access
✓JDK6提供了一组CompilerAPI可以在程序运行时编译类
✓要想拥有动态生成并且运行类能力,应该需要如下步骤:
a)生成.java源文件
b)将.java源文件编译成.class文件
c)实例化该类,以供使用
✓生成.java源文件,借助IO操作即可完成
✓实例化类文件,借助反射即可完成
✓使用JDK1.4就可完成上面所需的一,三步骤✓而步骤二在JDK6以前的版本中是没有提供实
现的,新加入的CompilerAPI无疑使之成为可能
✓处理API主要集中在javax.tools软件包中,主要接口如下:
Diagnostic<S>用于来自工具的诊断的
接口DiagnosticListener<S>用于接收来自工具的诊
断的接口JavaCompiler从程序中调用Java™
编程语言编译器的接口JavaFileObject在Java™ 编程语言源
和类文件上进行操作的
工具的文件抽象StandardJavaFileManager基于java.io.File 的文件
管理器
Pluggable Annotations
✓插入式注解处理API
(JSR 269)提供一套标准API处理Annotations ✓将Java语言的语义映射成为对象
把method, package, constructor, type, variable, enum, annotation等Java语言元素映射为Types和Elements ,从而建立了Java 语言本身的一个模型
✓在编译期间而不是运行期间处理Annotation Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理.如果Annotation Processor 处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation Processor,如果第二次处理还有新代码产生,就会接着调用Annotation Processor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation processing过程可以看作是一个round的序列.
✓主要被设计成为针对Tools或者容器的API
Http Server
✓JDK6提供了一个简单的Http Server API
✓可以构建自己的嵌入式Http Server, 它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现
✓程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求
✓把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange 传给HttpHandler实现类的回调方法
Console
✓JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备
✓如果程序要与windows下的cmd或者linux下的terminal交互,就可以用Console类
✓不总是能得到可用的Console
一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用. 如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。