《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > Java平臺J2SE1.5新特性展望

Java平臺J2SE1.5新特性展望

2008-12-19
作者:盛建昉

0.引言
??? J2SE平臺目前的正式發(fā)布的版本為1.4.2,下一個(gè)主要Java平臺J2SE1.5正在JCP(Java Community Process)的指導(dǎo)下進(jìn)行開發(fā),預(yù)期這個(gè)代號為“Tiger”的新版本將會在2003年最后一個(gè)季度發(fā)布Beta測試版,2004年初正式發(fā)布。這個(gè)最新的Java平臺將會給Java世界帶來些什么激動人心的新特性" title="新特性">新特性呢?根據(jù)JSR-176(Java Specification Request)、Java新聞組、Java社區(qū)論壇以及Sun公司發(fā)布的信息,新版本Java主要致力于以下幾個(gè)方面的改進(jìn):
1. 可靠性、可用性" title="可用性">可用性和適用性
2.?監(jiān)視與可管理性
3.?可伸縮性與執(zhí)行性能
4.?XML和客戶Web服務(wù)
5.?易于開發(fā)
??? 為了支持這些改進(jìn),新平臺修改了相關(guān)的語法,增加了核心類庫的API數(shù)量,修正了一些缺陷并對平臺做了進(jìn)一步優(yōu)化。下面分別對這五個(gè)方面作詳細(xì)介紹。
1.可靠性、可用性和適用性
??? Java平臺工具的成熟度、普及性、正在增長的各方支持以及可用性等諸多因素的結(jié)合使得面向關(guān)鍵任務(wù)" title="關(guān)鍵任務(wù)">關(guān)鍵任務(wù)的企業(yè)Java應(yīng)用越來越多。面向關(guān)鍵任務(wù)的應(yīng)用必須是高確定性、高可靠性和高可用性的。系統(tǒng)故障事件發(fā)生時(shí),面向關(guān)鍵任務(wù)的應(yīng)用需要立即被診斷、處理和修復(fù)。為了滿足這種需求,新Java平臺計(jì)劃針對客戶和服務(wù)器的Java運(yùn)行時(shí)(Java Runtimes)做出一些修補(bǔ)和優(yōu)化來提高平臺的可靠性和可用性。為了達(dá)到這一目的,新平臺還增加了兩個(gè)新的API規(guī)范。
1.1新Java平臺Profiling體系結(jié)構(gòu)
??? 平臺Profiling是正在運(yùn)行的虛擬機(jī)抽取系統(tǒng)資源使用狀況統(tǒng)計(jì)數(shù)據(jù)的能力,包括內(nèi)存使用狀況、CPU使用狀況、對象引用數(shù)目等等。現(xiàn)有的Profiling接口—JVMPI(Java Virtual Machine Profiling Interface)帶有相當(dāng)?shù)膶?shí)驗(yàn)性質(zhì),而且種種設(shè)計(jì)缺陷,規(guī)??缮炜s性問題,過于龐大的開銷以及不精確的Profiling,使得這一接口難以使用。新的Profiling體系結(jié)構(gòu)打算非兼容的取代JVMPI,提供類似的功能并進(jìn)行了增強(qiáng)。這些新的Profiling API將提供Profiling與高級垃圾收集(garbage collection)技術(shù)之間的互操作性,能在最大范圍的虛擬機(jī)上被可靠實(shí)現(xiàn),其中一部分將根據(jù)功能分組,以可選集合形式獲取,并提供支持何種選項(xiàng)的查詢。新的API致力于提供一個(gè)Java語言的執(zhí)行模型,而虛擬機(jī)的其他一些方面、本地化及操作系統(tǒng)模型可能直接提供,也可能通過擴(kuò)展機(jī)制提供。新的Profiling API可以被實(shí)現(xiàn)為能動態(tài)地打開或禁止Profiling功能,這樣當(dāng)Profiling功能禁止時(shí)對性能的影響可以忽略。應(yīng)用開發(fā)階段的Profiling會成為這個(gè)規(guī)范的主要目標(biāo),并且支持低開銷及混雜數(shù)據(jù)的設(shè)計(jì)目標(biāo)也將會支持部署階段的Profiling。
l.2?與應(yīng)用隔離的API規(guī)范
????當(dāng)在同一個(gè)主機(jī)上運(yùn)行多個(gè)Java應(yīng)用時(shí),龐大的初始化區(qū)、內(nèi)存需求的增長以及程序啟動的延時(shí)損害了Java固有的能力,在與其他一些更靈活高效的語言系統(tǒng)競爭時(shí),人們會懷疑Java在大規(guī)??缮炜s場合下的應(yīng)用前景。目前在服務(wù)器設(shè)置工作中,專門的腳本和本地代碼機(jī)制用于控制和平衡裝載多個(gè)Java虛擬機(jī),這種方式損害了可移植性、可維護(hù)性和系統(tǒng)的魯棒性。這個(gè)與應(yīng)用相隔離的API規(guī)范為管理Java應(yīng)用的生命周期提供了統(tǒng)一的機(jī)制,使得這些Java應(yīng)用在對象獲取方面互相隔離,但能潛在共享實(shí)現(xiàn)方面的資源。它提供了一種配置Java新實(shí)現(xiàn)特性的手段,這新的實(shí)現(xiàn)特性替代了以前在部署多個(gè)Java應(yīng)用時(shí)采用的專門的腳本機(jī)制,并增強(qiáng)了應(yīng)用規(guī)模的可伸縮性。API與應(yīng)用隔離的特性的實(shí)現(xiàn)保證了Java應(yīng)用之間運(yùn)行狀態(tài)的隔離,也許還會隔離本地接口(JNI)狀態(tài)和進(jìn)程狀態(tài)。新平臺中包含這個(gè)API會使在同一主機(jī)上運(yùn)行多個(gè)Java應(yīng)用變得更加容易,并且不用擔(dān)心操作系統(tǒng)資源被內(nèi)存中的多個(gè)JVM的拷貝所消耗。這對系統(tǒng)可靠性和可用性有著直接的影響。
2.監(jiān)視與可管理性
??? 隨著面向關(guān)鍵任務(wù)Java應(yīng)用的廣泛布署,產(chǎn)生了這樣一種需求:為Java應(yīng)用及其相應(yīng)的虛擬機(jī)的狀態(tài)提供一種統(tǒng)一標(biāo)準(zhǔn)的監(jiān)視機(jī)制,并且要求在不重新啟應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序的條件下修改應(yīng)用程序的狀態(tài)和運(yùn)行時(shí)的特性。目前應(yīng)用程序傾向于使用本地庫和程序完成類似的功能。新的JAVA平臺計(jì)劃引入一簇API來完成對基于Java的資源端到端的管理和監(jiān)視。
2.l?Java虛擬機(jī)(JVM)的監(jiān)視與管理
??? 這類API將為JAVA應(yīng)用程序,系統(tǒng)管理工具和RAS相關(guān)工具提供監(jiān)視JVM狀況,管理運(yùn)行時(shí)間控制的能力,比如類裝載,內(nèi)存使用狀況統(tǒng)計(jì),垃圾收集(garbage collection)統(tǒng)計(jì),線程統(tǒng)計(jì),對象引用數(shù)及狀態(tài)統(tǒng)計(jì),操作系統(tǒng)及平臺信息。它們還提供對JIT編譯,線程創(chuàng)建,垃圾收集操作及堆分配的控制,支持JMX調(diào)用,并且這類特性的實(shí)現(xiàn)將與新平臺的Profiling體系結(jié)構(gòu)協(xié)同開發(fā)。
2.2Java管理擴(kuò)展(JMX)
??? JMX是一項(xiàng)已存在的技術(shù),并且正在用于多種應(yīng)用中,比如JBOSS應(yīng)用服務(wù)器使用了JMX核心管理系統(tǒng)。這些擴(kuò)展在Java語言中為應(yīng)用程序及網(wǎng)絡(luò)的管理和監(jiān)視定義了體系結(jié)構(gòu),設(shè)計(jì)模式,API和服務(wù)。
??? JMX為Java開發(fā)人員提供了提交Java代碼、創(chuàng)建智能Java代理、實(shí)現(xiàn)分布式管理中間件和管理器的種種手段,并可將這類解決方案平滑地集成到已有的管理和監(jiān)視系統(tǒng)中去。另外,JMX被許多用于現(xiàn)存管理和監(jiān)視技術(shù)的API所引用。如今將JMX納入Java標(biāo)準(zhǔn)平臺滿足了Java社區(qū)統(tǒng)一管理和監(jiān)視Java應(yīng)用的要求。
3.可伸縮性與執(zhí)行性能
?? ?新平臺打算修正一些缺陷并提高Java運(yùn)行時(shí)的性能(包括客戶端及服務(wù)器端)。以下是為提高性能所做的具體改進(jìn):
· 修正和加速了垃圾收集機(jī)制(garbage collection)
· 減少了虛擬機(jī)的啟動時(shí)間
· 減少了內(nèi)存的覆蓋范圍
· 進(jìn)一步改進(jìn)了Hotspot虛擬機(jī)
· 應(yīng)用程序隔離API將使得單個(gè)虛擬機(jī)伸展為多應(yīng)用虛擬機(jī)而不需要實(shí)例化新的虛擬機(jī)進(jìn)程
· 增加了新的文件I/O能力支持批量訪問文件屬性,為文件和網(wǎng)絡(luò)套接字增加了異步I/O,增強(qiáng)了格式化I/O
??? 這些特性的改進(jìn)使得新平臺成為至今最快的Java平臺。
4.XML和客戶Web服務(wù)
??? 看起來無處不在的XML和Web服務(wù)使得標(biāo)準(zhǔn)Java平臺不得不對其提供支持。目前Java1.4已有一打XML解析器,相關(guān)XML數(shù)據(jù)結(jié)構(gòu)庫和XML處理庫。Java1.5打算引進(jìn)現(xiàn)存于SUN公司的WSDP(Web Service Developer Pack)中的一些庫來增加標(biāo)準(zhǔn)平臺中XML及Web服務(wù)API的數(shù)目。預(yù)期加入的新特性有:
· XML解析API(JAXP)的更新,以支持XML Schemas
· XML綁定API,用于將XML Schema編譯進(jìn)一個(gè)或多個(gè)Java類中
·??XML遠(yuǎn)程過程調(diào)用API(JAX-RPC)
·??XML數(shù)字簽名API
· XML數(shù)字加密API
·??現(xiàn)有XML庫的優(yōu)化和性能提升
·??Web服務(wù)客戶端支持
??? 由于XML及Web服務(wù)發(fā)展飛速,新版本Java希望成為使用這種技術(shù)創(chuàng)建應(yīng)用的自然選擇。
5.易于開發(fā)
??? Java語言和語法正在被增強(qiáng):代碼更可讀、更富于表達(dá)、更安全、更易于開發(fā),并且沒有失去兼容性。經(jīng)過幾年的討論和與其它語言的比較,Java的這些新特性正在被融合。這些特性是新版本中最希望被引用的,并且引發(fā)了Java社區(qū)廣泛的討論。這些改變包括類文件格式的更改,泛型(類似于C++中的模板)支持,“foreach”型的循環(huán)結(jié)構(gòu),原始類型與相應(yīng)對象數(shù)據(jù)類型自動轉(zhuǎn)換,使用靜態(tài)常量的改進(jìn)語法,以及元數(shù)據(jù)" title="元數(shù)據(jù)">元數(shù)據(jù)標(biāo)簽的使用等等。
??? 這些改變對開發(fā)人員寫Java程序的方式將會發(fā)生重要影響。要想利用這些改變,開發(fā)人員需要學(xué)習(xí)新的語言特性、新的語法。下面讓我們深入了解一下這些新特性。
?· 類文件格式的改變
??? 這個(gè)改變是為了增加對不斷更新的Java平臺及語言規(guī)范的支持,包括增加對更快和更有效的字節(jié)碼校驗(yàn)的支持,直接從類文件格式支持類字面量,增加以往暗含限制類文件的大小。這些改變對應(yīng)用開發(fā)人員是透明的,現(xiàn)在代碼不需要作任何改變。

?· 泛型的支持
??? 泛型支持是一種指定用于類集中的特定對象類型的功能,而不是使用缺省的Object類型的行為。這種想法基于參量的多態(tài)機(jī)制。下面用例子加以說明。
???比如你有一個(gè)方法,用來打印類集中所以字符串的小寫形式:
???/**
?? ???* Print all the Strings in the Collection in lower case.
?? ???**/
public void printLowerCase(Collection c) {
??? Iterator iter = c.iterator();
??? ??while(iter.hasNext()) {
????? ????String str = (String)iter.next();
System.out.println(str.toLowerCase());
??? ????}
? ???}
??? 這里需要注意的是每次迭代經(jīng)過Collection時(shí)都要有顯式的類型轉(zhuǎn)換,轉(zhuǎn)換到String。這是一種產(chǎn)生錯誤的傾向。如果一個(gè)程序員不小心傳遞了其它類型的類集,這個(gè)方法編譯成功,但會在運(yùn)行期產(chǎn)生一個(gè)ClassCastException。這段代碼正確執(zhí)行的前提是Collection必須容納String。這從方法的簽名中看不出來,只是在描述方法的文檔里提到。
??? 泛型提供了一種避免類型轉(zhuǎn)換的方法,它將一般類集與特定類型在編譯時(shí)而不是運(yùn)行時(shí)綁定在一起。以上方法以泛型方式書寫如下:
/**
* Print all the Collection Strings in lower case.
**/
public void printLowerCase(Collection c) {
Iterator iter = c.iterator();
??? while(iter.hasNext()) {
String str = iter.next();
????? ?System.out.println(str.toLowerCase());
??? }
}
??? 這里我們顯式指定了Collection將要包含哪種類型的對象,從而不需要強(qiáng)制類型轉(zhuǎn)換。程序員的意圖完全可以從方法簽名中表現(xiàn)而不是在注釋文檔中描述。若使用此方法的程序員錯誤地傳遞了類型所包含的類型,此方法不會通過編譯。這消除了運(yùn)行時(shí)的異常,提供了編譯時(shí)類型的安全性。泛型將會提高代碼的可讀性、表達(dá)能力,并提供了安全性,避免產(chǎn)生運(yùn)行時(shí)異常。
· “foreach”循環(huán)結(jié)構(gòu)
??? 新版本Java計(jì)劃加入其它語言中常見的“foreach”循環(huán)結(jié)構(gòu),這個(gè)結(jié)構(gòu)主要是為了增加開發(fā)人員的生產(chǎn)力,減少循環(huán)迭代所需要的代碼數(shù)量。
??? 比如我們要對一個(gè)包含字符串的類集循環(huán)迭代,目前你可用while或for循環(huán)語句:
Collection c;
Iterator i = collection.iterator();
while(i.hasNext()) {
? // Process element
}
for(Iterator i = c.iterator; i.hasNext() ; ) {
? // Process element.
}
???? 這兩種結(jié)構(gòu)都需要創(chuàng)建一個(gè)Iterator對象,并且調(diào)用hasNext()方法顯式地在迭代遍歷類集。
??? “增強(qiáng)的for結(jié)構(gòu)”使得代碼變?yōu)槿缦滤荆?BR>Collection c;
for( Object o : c ) {
? //Process element
}
結(jié)合泛型支持代碼可變?yōu)椋?BR>Collection c;
for( String o : c) {
? //Process element
}
“foreach”類型的結(jié)構(gòu)消除了Iterator的創(chuàng)建,將完成迭代的細(xì)節(jié)交給了編譯器,同時(shí)也減少了代碼的數(shù)量。
·??原始類型與相應(yīng)對象類型的自動轉(zhuǎn)換
??? 在現(xiàn)在的Java平臺中如果你想將一個(gè)原始的int型加到一個(gè)Integer對象上,你必須這樣做:
int i;
Integer j;
int k = i + j.intValue();
Integer kObj = new Integer(k);
在Java1.5中這種轉(zhuǎn)換變成了自動進(jìn)行,代碼只要簡單寫成
int i;
Integer j;
int k = i + j;
Integer kObj = i + j;
??? 這一特性為程序員幾乎消除了原始類型與相應(yīng)對象類型間的所有差異。更進(jìn)一步,它允許將原始類型加入到類集中去。因此這段代碼
Collection c;
int i;

c.add(new Integer(i));
可變?yōu)?BR>c.add(i);
使用靜態(tài)常量的語法改進(jìn)
??? 在Java中使用常量,程序員必須完全限制常量的引用或者實(shí)現(xiàn)一個(gè)定義常量的接口,例如:
public interface Constants {
? public static final int DAYS_IN_WEEK = 7;
? public static final int DAYS_IN_YEAR = 365;
}
??? 要使用這些常量,程序員必須完全限制常量引用:
int weeks_in_year =
??? Constants.DAYS_IN_YEAR/Constants.DAYS_OF_WEEK;
或?qū)崿F(xiàn)一接口
public class Year implements Constants {
? int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
新版本Java中將引入一個(gè)“static import”工具,允許不用加類名前綴或?qū)崿F(xiàn)一個(gè)接口引用靜態(tài)常量。
import static Constants;
public class Year {
? int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
Import語句使得所有Contants類的靜態(tài)成員對類Year都是可見的。這種緊湊的語法減少了代碼并克服了實(shí)現(xiàn)一個(gè)接口的不利之處。
元數(shù)據(jù)標(biāo)簽注釋源代碼
??? 編寫EJB和RMI應(yīng)用的程序員需要定義許多樣板代碼來實(shí)現(xiàn)對象。例如要實(shí)現(xiàn)一個(gè)遠(yuǎn)程對象,你必須定義一個(gè)接口:
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServiceRunner extends Remote {
??? Object executeService(Service s) throws RemoteException;
}
并且定義一個(gè)此遠(yuǎn)程接口的實(shí)現(xiàn):
package servicerunner;
import java.rmi.*;
import java.rmi.server.*;
public class ServiceRunnerImpl extends UnicastRemoteObject
?????????????????????????????? implements ServiceRunner
{
??? public Object executeService(Service t) {
??????? ...
??? }
}
??? 使用元數(shù)據(jù)標(biāo)簽可以指示編譯器產(chǎn)生必要的遠(yuǎn)程接口模板代碼:
public class ServiceRunner {
??? @Remote public Object executeService(Service t) {
??????? ...
??? }
}
6.結(jié)束語
??? 正如你以上所見,Java1.5新版本將會是一個(gè)擴(kuò)大的版本,尤其在語言方面改變很大??傮w來說,這些新特性的引進(jìn)增加了學(xué)習(xí)曲線的長度,但使得Java變得對程序員更加友好和易用。語言的改變擴(kuò)大了Java對交叉語言開發(fā)者的影響,性能的增強(qiáng)使Java比以往任何時(shí)候運(yùn)行更快。對XML及Web服務(wù)的關(guān)注使Java成為目前網(wǎng)絡(luò)編程的一種典范語言,這個(gè)新版本Java1.5的發(fā)布將會使Java平臺更加流行。
參考文獻(xiàn):
·?JSR Documents
http://www.jcp.org/en/jsr
·?Josh Bloch's article on New Language Features for Tiger:
http://java.sun.com/features/2003/05/bloch_qa.html

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。