0.引言
??? J2SE平臺目前的正式發(fā)布的版本為1.4.2,,下一個主要Java平臺J2SE1.5正在JCP(Java Community Process)的指導下進行開發(fā),,預期這個代號為“Tiger”的新版本將會在2003年最后一個季度發(fā)布Beta測試版,,2004年初正式發(fā)布,。這個最新的Java平臺將會給Java世界帶來些什么激動人心的新特性" title="新特性">新特性呢,?根據(jù)JSR-176(Java Specification Request),、Java新聞組,、Java社區(qū)論壇以及Sun公司發(fā)布的信息,,新版本Java主要致力于以下幾個方面的改進:
1. 可靠性、可用性" title="可用性">可用性和適用性
2.?監(jiān)視與可管理性
3.?可伸縮性與執(zhí)行性能
4.?XML和客戶Web服務
5.?易于開發(fā)
??? 為了支持這些改進,,新平臺修改了相關的語法,,增加了核心類庫的API數(shù)量,修正了一些缺陷并對平臺做了進一步優(yōu)化,。下面分別對這五個方面作詳細介紹,。
1.可靠性、可用性和適用性
??? Java平臺工具的成熟度,、普及性,、正在增長的各方支持以及可用性等諸多因素的結合使得面向關鍵任務" title="關鍵任務">關鍵任務的企業(yè)Java應用越來越多。面向關鍵任務的應用必須是高確定性,、高可靠性和高可用性的,。系統(tǒng)故障事件發(fā)生時,,面向關鍵任務的應用需要立即被診斷、處理和修復,。為了滿足這種需求,,新Java平臺計劃針對客戶和服務器的Java運行時(Java Runtimes)做出一些修補和優(yōu)化來提高平臺的可靠性和可用性。為了達到這一目的,,新平臺還增加了兩個新的API規(guī)范,。
1.1新Java平臺Profiling體系結構
??? 平臺Profiling是正在運行的虛擬機抽取系統(tǒng)資源使用狀況統(tǒng)計數(shù)據(jù)的能力,包括內存使用狀況,、CPU使用狀況,、對象引用數(shù)目等等。現(xiàn)有的Profiling接口—JVMPI(Java Virtual Machine Profiling Interface)帶有相當?shù)膶嶒炐再|,,而且種種設計缺陷,,規(guī)模可伸縮性問題,,過于龐大的開銷以及不精確的Profiling,,使得這一接口難以使用。新的Profiling體系結構打算非兼容的取代JVMPI,,提供類似的功能并進行了增強,。這些新的Profiling API將提供Profiling與高級垃圾收集(garbage collection)技術之間的互操作性,能在最大范圍的虛擬機上被可靠實現(xiàn),,其中一部分將根據(jù)功能分組,,以可選集合形式獲取,并提供支持何種選項的查詢,。新的API致力于提供一個Java語言的執(zhí)行模型,,而虛擬機的其他一些方面、本地化及操作系統(tǒng)模型可能直接提供,,也可能通過擴展機制提供,。新的Profiling API可以被實現(xiàn)為能動態(tài)地打開或禁止Profiling功能,這樣當Profiling功能禁止時對性能的影響可以忽略,。應用開發(fā)階段的Profiling會成為這個規(guī)范的主要目標,,并且支持低開銷及混雜數(shù)據(jù)的設計目標也將會支持部署階段的Profiling。
l.2?與應用隔離的API規(guī)范
????當在同一個主機上運行多個Java應用時,,龐大的初始化區(qū),、內存需求的增長以及程序啟動的延時損害了Java固有的能力,在與其他一些更靈活高效的語言系統(tǒng)競爭時,,人們會懷疑Java在大規(guī)??缮炜s場合下的應用前景。目前在服務器設置工作中,專門的腳本和本地代碼機制用于控制和平衡裝載多個Java虛擬機,,這種方式損害了可移植性,、可維護性和系統(tǒng)的魯棒性。這個與應用相隔離的API規(guī)范為管理Java應用的生命周期提供了統(tǒng)一的機制,,使得這些Java應用在對象獲取方面互相隔離,,但能潛在共享實現(xiàn)方面的資源。它提供了一種配置Java新實現(xiàn)特性的手段,,這新的實現(xiàn)特性替代了以前在部署多個Java應用時采用的專門的腳本機制,,并增強了應用規(guī)模的可伸縮性。API與應用隔離的特性的實現(xiàn)保證了Java應用之間運行狀態(tài)的隔離,,也許還會隔離本地接口(JNI)狀態(tài)和進程狀態(tài),。新平臺中包含這個API會使在同一主機上運行多個Java應用變得更加容易,并且不用擔心操作系統(tǒng)資源被內存中的多個JVM的拷貝所消耗,。這對系統(tǒng)可靠性和可用性有著直接的影響,。
2.監(jiān)視與可管理性
??? 隨著面向關鍵任務Java應用的廣泛布署,產(chǎn)生了這樣一種需求:為Java應用及其相應的虛擬機的狀態(tài)提供一種統(tǒng)一標準的監(jiān)視機制,,并且要求在不重新啟應用程序" title="應用程序">應用程序的條件下修改應用程序的狀態(tài)和運行時的特性,。目前應用程序傾向于使用本地庫和程序完成類似的功能。新的JAVA平臺計劃引入一簇API來完成對基于Java的資源端到端的管理和監(jiān)視,。
2.l?Java虛擬機(JVM)的監(jiān)視與管理
??? 這類API將為JAVA應用程序,,系統(tǒng)管理工具和RAS相關工具提供監(jiān)視JVM狀況,管理運行時間控制的能力,,比如類裝載,,內存使用狀況統(tǒng)計,垃圾收集(garbage collection)統(tǒng)計,,線程統(tǒng)計,對象引用數(shù)及狀態(tài)統(tǒng)計,,操作系統(tǒng)及平臺信息,。它們還提供對JIT編譯,線程創(chuàng)建,,垃圾收集操作及堆分配的控制,,支持JMX調用,并且這類特性的實現(xiàn)將與新平臺的Profiling體系結構協(xié)同開發(fā),。
2.2Java管理擴展(JMX)
??? JMX是一項已存在的技術,,并且正在用于多種應用中,比如JBOSS應用服務器使用了JMX核心管理系統(tǒng),。這些擴展在Java語言中為應用程序及網(wǎng)絡的管理和監(jiān)視定義了體系結構,,設計模式,API和服務,。
??? JMX為Java開發(fā)人員提供了提交Java代碼,、創(chuàng)建智能Java代理,、實現(xiàn)分布式管理中間件和管理器的種種手段,并可將這類解決方案平滑地集成到已有的管理和監(jiān)視系統(tǒng)中去,。另外,,JMX被許多用于現(xiàn)存管理和監(jiān)視技術的API所引用。如今將JMX納入Java標準平臺滿足了Java社區(qū)統(tǒng)一管理和監(jiān)視Java應用的要求,。
3.可伸縮性與執(zhí)行性能
?? ?新平臺打算修正一些缺陷并提高Java運行時的性能(包括客戶端及服務器端),。以下是為提高性能所做的具體改進:
· 修正和加速了垃圾收集機制(garbage collection)
· 減少了虛擬機的啟動時間
· 減少了內存的覆蓋范圍
· 進一步改進了Hotspot虛擬機
· 應用程序隔離API將使得單個虛擬機伸展為多應用虛擬機而不需要實例化新的虛擬機進程
· 增加了新的文件I/O能力支持批量訪問文件屬性,為文件和網(wǎng)絡套接字增加了異步I/O,,增強了格式化I/O
??? 這些特性的改進使得新平臺成為至今最快的Java平臺,。
4.XML和客戶Web服務
??? 看起來無處不在的XML和Web服務使得標準Java平臺不得不對其提供支持。目前Java1.4已有一打XML解析器,,相關XML數(shù)據(jù)結構庫和XML處理庫,。Java1.5打算引進現(xiàn)存于SUN公司的WSDP(Web Service Developer Pack)中的一些庫來增加標準平臺中XML及Web服務API的數(shù)目。預期加入的新特性有:
· XML解析API(JAXP)的更新,,以支持XML Schemas
· XML綁定API,,用于將XML Schema編譯進一個或多個Java類中
·??XML遠程過程調用API(JAX-RPC)
·??XML數(shù)字簽名API
· XML數(shù)字加密API
·??現(xiàn)有XML庫的優(yōu)化和性能提升
·??Web服務客戶端支持
??? 由于XML及Web服務發(fā)展飛速,新版本Java希望成為使用這種技術創(chuàng)建應用的自然選擇,。
5.易于開發(fā)
??? Java語言和語法正在被增強:代碼更可讀,、更富于表達、更安全,、更易于開發(fā),,并且沒有失去兼容性。經(jīng)過幾年的討論和與其它語言的比較,,Java的這些新特性正在被融合,。這些特性是新版本中最希望被引用的,并且引發(fā)了Java社區(qū)廣泛的討論,。這些改變包括類文件格式的更改,,泛型(類似于C++中的模板)支持,“foreach”型的循環(huán)結構,,原始類型與相應對象數(shù)據(jù)類型自動轉換,,使用靜態(tài)常量的改進語法,以及元數(shù)據(jù)" title="元數(shù)據(jù)">元數(shù)據(jù)標簽的使用等等,。
??? 這些改變對開發(fā)人員寫Java程序的方式將會發(fā)生重要影響,。要想利用這些改變,開發(fā)人員需要學習新的語言特性,、新的語法,。下面讓我們深入了解一下這些新特性。
?· 類文件格式的改變
??? 這個改變是為了增加對不斷更新的Java平臺及語言規(guī)范的支持,包括增加對更快和更有效的字節(jié)碼校驗的支持,,直接從類文件格式支持類字面量,,增加以往暗含限制類文件的大小。這些改變對應用開發(fā)人員是透明的,,現(xiàn)在代碼不需要作任何改變,。
?· 泛型的支持
??? 泛型支持是一種指定用于類集中的特定對象類型的功能,而不是使用缺省的Object類型的行為,。這種想法基于參量的多態(tài)機制,。下面用例子加以說明。
???比如你有一個方法,,用來打印類集中所以字符串的小寫形式:
???/**
?? ???* 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時都要有顯式的類型轉換,,轉換到String。這是一種產(chǎn)生錯誤的傾向,。如果一個程序員不小心傳遞了其它類型的類集,,這個方法編譯成功,但會在運行期產(chǎn)生一個ClassCastException,。這段代碼正確執(zhí)行的前提是Collection必須容納String,。這從方法的簽名中看不出來,只是在描述方法的文檔里提到,。
??? 泛型提供了一種避免類型轉換的方法,,它將一般類集與特定類型在編譯時而不是運行時綁定在一起。以上方法以泛型方式書寫如下:
/**
* Print all the Collection Strings in lower case.
**/
public void printLowerCase(Collection
Iterator
??? while(iter.hasNext()) {
String str = iter.next();
????? ?System.out.println(str.toLowerCase());
??? }
}
??? 這里我們顯式指定了Collection將要包含哪種類型的對象,,從而不需要強制類型轉換,。程序員的意圖完全可以從方法簽名中表現(xiàn)而不是在注釋文檔中描述。若使用此方法的程序員錯誤地傳遞了類型所包含的類型,,此方法不會通過編譯,。這消除了運行時的異常,提供了編譯時類型的安全性,。泛型將會提高代碼的可讀性,、表達能力,并提供了安全性,,避免產(chǎn)生運行時異常。
· “foreach”循環(huán)結構
??? 新版本Java計劃加入其它語言中常見的“foreach”循環(huán)結構,,這個結構主要是為了增加開發(fā)人員的生產(chǎn)力,,減少循環(huán)迭代所需要的代碼數(shù)量。
??? 比如我們要對一個包含字符串的類集循環(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.
}
???? 這兩種結構都需要創(chuàng)建一個Iterator對象,,并且調用hasNext()方法顯式地在迭代遍歷類集。
??? “增強的for結構”使得代碼變?yōu)槿缦滤荆?BR>Collection c;
for( Object o : c ) {
? //Process element
}
結合泛型支持代碼可變?yōu)椋?BR>Collection c;
for( String o : c) {
? //Process element
}
“foreach”類型的結構消除了Iterator的創(chuàng)建,將完成迭代的細節(jié)交給了編譯器,,同時也減少了代碼的數(shù)量,。
·??原始類型與相應對象類型的自動轉換
??? 在現(xiàn)在的Java平臺中如果你想將一個原始的int型加到一個Integer對象上,你必須這樣做:
int i;
Integer j;
int k = i + j.intValue();
Integer kObj = new Integer(k);
在Java1.5中這種轉換變成了自動進行,,代碼只要簡單寫成
int i;
Integer j;
int k = i + j;
Integer kObj = i + j;
??? 這一特性為程序員幾乎消除了原始類型與相應對象類型間的所有差異,。更進一步,它允許將原始類型加入到類集中去,。因此這段代碼
Collection c;
int i;
c.add(new Integer(i));
可變?yōu)?BR>c.add(i);
?· 使用靜態(tài)常量的語法改進
??? 在Java中使用常量,,程序員必須完全限制常量的引用或者實現(xiàn)一個定義常量的接口,例如:
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;
或實現(xiàn)一接口
public class Year implements Constants {
? int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
新版本Java中將引入一個“static import”工具,,允許不用加類名前綴或實現(xiàn)一個接口引用靜態(tài)常量。
import static Constants;
public class Year {
? int weeks_in_year = DAYS_IN_YEAR/DAYS_IN_WEEK;
}
Import語句使得所有Contants類的靜態(tài)成員對類Year都是可見的,。這種緊湊的語法減少了代碼并克服了實現(xiàn)一個接口的不利之處,。
?· 元數(shù)據(jù)標簽注釋源代碼
??? 編寫EJB和RMI應用的程序員需要定義許多樣板代碼來實現(xiàn)對象。例如要實現(xiàn)一個遠程對象,,你必須定義一個接口:
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServiceRunner extends Remote {
??? Object executeService(Service s) throws RemoteException;
}
并且定義一個此遠程接口的實現(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ù)標簽可以指示編譯器產(chǎn)生必要的遠程接口模板代碼:
public class ServiceRunner {
??? @Remote public Object executeService(Service t) {
??????? ...
??? }
}
6.結束語
??? 正如你以上所見,,Java1.5新版本將會是一個擴大的版本,尤其在語言方面改變很大,??傮w來說,這些新特性的引進增加了學習曲線的長度,,但使得Java變得對程序員更加友好和易用,。語言的改變擴大了Java對交叉語言開發(fā)者的影響,性能的增強使Java比以往任何時候運行更快,。對XML及Web服務的關注使Java成為目前網(wǎng)絡編程的一種典范語言,,這個新版本Java1.5的發(fā)布將會使Java平臺更加流行。
參考文獻:
·?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