GWT筆記(6)
Java仿真(Java Emulation)
盡管完整的GWT應用程式能用Java寫出,再部分被翻譯成JavaScript用于用戶端執行。但這裡有幾個不足:
1)面向用戶端的代碼被某java包所限制,隻能作為其子集,該java包是Google的java到javascript翻譯器所支援的java包。
2)另外,用戶端運作的代碼隻使用JRE的子集,該子集能被JavaScript所支援。
一旦你熟悉它們後,你會發現這些限制并不象早先想的那麼壞。這有點象寫移動版的Java應用程式(J2ME)。
一、語言子集(Language subset)
GWT的java到javascript翻譯器解析源代碼,就像java編譯器一樣,但不是将其編譯成位元組碼,而是JavaScript代碼。
如果你使用GWT不支援的語言特征的話,在主機模式你的代碼會工作的很好,但是為了在Web模式運作,編譯到JavaScript時,将得到錯誤。
1)Language Level
GWT編譯器編譯Java源碼是相容J2SE1.4.2及更早的版本,對Java 5的新特征則不支援。
2)Intrinsic types
支援byte,char,short,int,long,float,double,Object,String和arrays。
然而,JavaScript沒有64位的整型,故long被映射成double類型的浮點數值。要確定在主機模式和Web模式的連續性,Google推薦使用int變量。
3)Exception
try,catch,finally和使用者自定義的exception都是支援的。
4)Assertions
GWT編譯器解析Java的assert語句時,在JavaScript代碼中不會省略它的。assert如果能作為VM參數的話,在主機模式下被處理。
5)Multithreading and synchronization
JavaScript解釋器是單線程的,是以GWT處理synchronized關鍵字時,它不會起任何作用。synchronization相關庫方法是無效的,包括Object.wait(),Object.notify()和Object.notifyAll()。
6)Relection
GWT不支援類的連續的動态加載。
7)Finalization
JavaScript不支援finalization對象。
8)Strict floating-point
Java文法規範精确地定義了浮點類型,包括單精度數和雙精度數,用strictfp關鍵字來定義的。GWT不支援strictfp關鍵字。
二、Library subset
為了面向用戶端代碼,GWT隻支援JRE庫的子集。一個原因是JRE庫太大,另一個原因是JavaScript沙盒不支援那麼多特征。
GWT仿真不同于JRE運作環境。
1)Regular expressions
Java的正規表達式文法和JavaScript的是相似的,但使用時還是要小心其中的不同。
2)Serialization
GWT不支援标準的Java serialization。然而,GWT有一個RPC工具,它提供了自動的對象序列化。
三、Supported Packages
為了用戶端代碼,GWT實作了JRE1.4的Java.lang和java.util包的子集。
java.lang package
1)Classes
Boolean,Byte,Character,Class,Double(1),Float(1),Integer,long(1),Math,Number,Object,Short,String(2),StringBuffer,System。
注:
(1) 避免使用map關鍵字;
(2) 正規表達式改變其标準實作。
2)Errors and Exceptions
ArrayStoreException,AssertionError,CalssCastException,Error,IllegalArgumentException,IllegalStateException,IndexOutOfBoundsException,NegativeArraySizeException,NullPointerException,NumberFormatException,RuntimeException,StringIndexOutOfBoundsException,Throwable(1),UnsupportedOperationException.
(1) 堆棧追蹤目前還不支援。
3)Interfaces
CharSequence,Cloneable,Comparable.
java.util package
AbstractCollection,AbstractList,AbstractMap,ArrayList,Arrays,Collections,Date,HashMap,HashSet,Stack,Vector(1).
(1) 不檢查索引的有效性
EmptyStackException,NoSuchElementException,TooManyListenersException.
Collection,Comparator,EventListener,Iterator,List,Map,RandomAccess,Set.
四、正規表達式
1)Boundary matchers
----------------------------------------------------------------
Expression Meaning
^ 行開始
$ 行結束
/b 文字邊界
/B 非文字邊界
2)Quantifiers
* 0到多次
+ 1到多次
? 0到1次
{n} 恰好n次
{n,} n到更多次
{n,m} 在n到m次之間
3)Miscellaneous
. 任意字元
*(x) 捕獲組
(?:x) 非捕獲組
x(?=y) 0寬度正數超前
x(?!y) 0寬度負數超前
x|y x或y
/n 傳回捕獲組的引用。不能使用“/0”
你可以假裝Java代碼直接運作在浏覽器上。代碼可以被用戶端和伺服器端共享。