JDK1.5 与 JDK1.6的新特性
JDK1.5 與 JDK1.6的新特性 收藏
?一、JDK1.5的新特性
??????? 了解Java語言的特色及相關術語
??????? 泛型:泛型、通配符、有限制通配符、泛型方法
??????? 加強循環
??????? 自動裝箱/拆箱
??????? 枚舉
??????? 可變參數
??????? 靜態引入
??????? 元數據
??????? 控制臺輸入
??????? 改變返回類型
??????? 格式化I/O
1.泛型(Generic)
C++通過模板技術可以指定集合的元素類型,而Java在1.5之前一直沒有相對應的功能。一個集合可以放任何類型的對象,相應地從集合里面拿對象的時候我們也不得不對他們進行強制得類型轉換。猛虎引入了泛型,它允許指定集合里元素的類型,這樣你可以得到強類型在編譯時刻進行類型檢查的好處。
2.For-Each循環
For-Each循環得加入簡化了集合的遍歷。
3.自動裝包/拆包(Autoboxing/unboxing)
自動裝包/拆包大大方便了基本類型數據和它們包裝類地使用。
自動裝包:基本類型自動轉為包裝類.(int >> Integer)
自動拆包:包裝類自動轉為基本類型.(Integer >> int)
4.枚舉(Enums)
JDK1.5加入了一個全新類型的"類"-枚舉類型。為此JDK1.5引入了一個新關鍵字enmu. 我們可以這樣來定義一個枚舉類型。
public enum Color
{
Red,
White,
Blue
}
然后可以這樣來使用Color myColor = Color.Red.
枚舉類型還提供了兩個有用的靜態方法values()和valueOf(). 我們可以很方便地使用它們,例如
for (Color c : Color.values())
System.out.println?;
5.可變參數(Varargs)
可變參數使程序員可以聲明一個接受可變數目參數的方法。注意,可變參數必須是函數聲明中的最后一個參數。假設我們要寫一個簡單的方法打印一些對象,
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);
…
在JDK1.5之前,我們可以用重載來實現,但是這樣就需要寫很多的重載函數,顯得不是很有效。如果使用可變參數的話我們只需要一個函數就行了
public void write(Object... objs) {
for (Object obj: objs)
System.out.println(obj);
}
在引入可變參數以后,Java的反射包也更加方便使用了。對于c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0])),現在我們可以這樣寫了c.getMethod("test").invoke(c.newInstance()),這樣的代碼比原來清楚了很多?!?/p>
6.靜態導入(Static Imports)
要使用用靜態成員(方法和變量)我們必須給出提供這個方法的類。使用靜態導入可以使被導入類的所有靜態變量和靜態方法在當前類直接可見,使用這些靜態成員無需再給出他們的類名。
import static java.lang.Math.*;
…….
r = sin(PI * 2); //無需再寫r = Math.sin(Math.PI);
不過,過度使用這個特性也會一定程度上降低代碼地可讀性。
??? 二、JDK1.6的新特性
??????? 簡化Web Services
??????? 整合腳本語言
??????? 綁定Derby
??????? 更豐富的Desktop APIs
??????? 監視和管理
??????? 可插入式元數據
??????? 訪問編譯器
??????? 安全性
一:Desktop類和SystemTray類
在JDK1.6中,AWT新增加了兩個類:Desktop和SystemTray。
前者可以用來打開系統默認瀏覽器瀏覽指定的URL,打開系統默認郵件客戶端給指定的郵箱發郵件,用默認應用程序打開或編輯文件(比如,用記事本打開以txt為后綴名的文件),用系統默認的打印機打印文檔;后者可以用來在系統托盤區創建一個托盤程序。
二:使用JAXB2來實現對象與XML之間的映射
JAXB是Java Architecture for XML Binding的縮寫,可以將一個Java對象轉變成為XML格式,反之亦然。
我們把對象與關系數據庫之間的映射稱為ORM,其實也可以把對象與XML之間的映射稱為OXM(Object XML Mapping)。原來JAXB是Java EE的一部分,在JDK1.6中,SUN將其放到了Java SE中,這也是SUN的一貫做法。JDK1.6中自帶的這個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)是JDK1.6.0中除了DOM和SAX之外的又一種處理XML文檔的API。
StAX 的來歷:在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML)。
由于JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,并將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本)。JDK1.6里面JAXP的版本就是1.4。
StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過提供一種基于事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過程,程序遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產生一個解析事件然后處理該事件,之后又促使解析器產生下一個解析事件,如此循環直到碰到文檔結束符;
SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個xml文檔后,才產生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將整個xml文檔映射到一顆內存樹,這樣就可以很容易地得到父節點和子結點以及兄弟節點的數據,但如果文檔很大,將會嚴重影響性能。
四:使用Compiler API
現在我 們可以用JDK1.6 的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
JDK1.6 提供了一個簡單的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開發控制臺程序
JDK1.6中提供了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)
在JDK6.0中用StAX解析XML
摘要
J2EE/XML開發人員一般都用DOM(Document Object Model,文檔對象模型)API或者(SAX Simple API for XML)來解析XML文件。這些API各有利弊。DOM API對內存要求高,因為用DOM操縱XML文件需要先將整個XML文件的結構保存到內存中。而SAX API是一個推式解析模型,解析事件由解析器產生。與上面兩種方式不同,StAX基于拉式解析模型。在本文中,我們首先建立一個XML文件,然后運用事件生成的StAX拉式方法,采用不同的方法解析它。
<script type="text/javascript"><!--
google_ad_client = "pub-4751025308591894";
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = "180x60_as_rimg";
google_cpa_choice = "CAAQqfyujAIaCL3B8SF26akaKO3M93M";
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
推式解析 vs. 拉式解析
和推式解析相比,拉式解析具有以下優點:
1、在拉式解析中,事件是由解析應用產生的,因此拉式解析中向客戶端提供的是解析規則,而不是解析器。
2、同推式解析相比,拉式解析的代碼更簡單,而且不用那么多庫。
3、拉式解析客戶端能夠一次讀取多個XML文件。
4、拉式解析允許你過濾XML文件和跳過解析事件。
進入StAX的世界
StAX是Streaming API for XML的縮寫,它包含在2004年3月的JSR 173 中。StAX是JDK6.0中包含的新特性。
在推式模型中,直到整個XML文件全部被解析,解析器才會產生解析事件。而拉式解析由應用程序來控制,也就是說解析事件由應用程序產生。這就意味著,你可以暫緩解析、解析時跳過某個元素或者同時解析多個文件。用DOM解析式要先將XML文件解析成DOM結構,因此降低了解析效率。使用StAX,解析事件在XML文件解析過程中產生。下面是各種解析方法之間的比較:
| ?XML Parser API Feature Summary | ||||
| Feature | StAX | SAX | DOM | TrAX |
| API Type | Pull, streaming | Push, streaming | In memory tree | XSLT Rule |
| Ease of Use | High | Medium | High | Medium |
| XPath Capability | No | No | Yes | Yes |
| CPU and Memory Efficiency | Good | Good | Varies | Varies |
| Forward Only | Yes | Yes | No | No |
| Read XML | Yes | Yes | Yes | Yes |
| Write XML | Yes | No | Yes | Yes |
| Create, Read, Update, Delete | No | No | Yes | No |
StAX API同樣也在JWSDP(Java Web Services Developer Pack )1.6中得到實現,你可以在包javax.xml.stream 中找到它。XMLStreamReader接口用來解析XML文件。XMLStreamWriter接口用來生成XML文件,XMLEventReader用一個對象事件迭代器來解析XML事件。與之相反,XMLStreamReader采用的是游標機制。
前期準備
如果你正在用JDK1.6,那么StAX API已經在默認的路徑下了。如果你在用JWSDP 1.6,你需要添加JWSDP 1.6 StAX API到指定路徑下。將<jwsdp-1.6>\sjsxp\lib\ jsr173_api.jar 和 <jwsdp-1.6>;\sjsxp\lib\sjsxp.jar添加到CLASSPATH環境變量中,安裝JWSDP 1.6到<jwsdp-1.6>目錄下,Jsr173_api.jar 是 JSR-173 API的JAR。
未完,待續。。。
?
總結
以上是生活随笔為你收集整理的JDK1.5 与 JDK1.6的新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java更新XML的四种常用方法简介
- 下一篇: 使用JAXB将XML Schema绑定到