語言之美係列一 - Java篇
受七周七語言、編程語言實現模式等讀物啟發,計劃寫一個語言之美係列博文,因為最近工作上用的比較多的語言是Java,所以先從它開刀,希望大家多提寶貴意見~
一. 泛型
(1). 泛型類並沒有自己獨有的Class類對象;
(2). 靜態變量是被泛型類的所有實例所共享的;
(3). 泛型的類型參數不能用在Java異常處理的catch語句中;
(4). List<? extends Number>說明List中可能包含的元素類型是Number及其子類。而List<? super Number>則說明List中包含的是Number及其父類;
(5). 泛型繼承體係:
a.相同類型參數的泛型類的關係取決於泛型類自身的繼承體係結構。即List<String>是Collection<String>的子類型,List<String>可以替換Collection<String>。這種情況也適用於帶有上下界的類型聲明。
b.當泛型類的類型聲明中使用了通配符的時候,其子類型可以在兩個維度上分別展開。如對Collection<? extends Number>來說,其子類型可以在Collection這個維度上展開,即List<? extends Number>和Set<? extends Number>等;也可以在Number這個層次上展開,即Collection<Double>和 Collection<Integer>等。如此循環下去,ArrayList<Long>和
HashSet<Double>等也都算是Collection<? extends Number>的子類型。
c.如果泛型類中包含多個類型參數,則對於每個類型參數分別應用上麵的規則。
(6). 在使用帶通配符的泛型類的時候,需要明確通配符所代表的一組類型的概念。由於具體的類型是未知的,很多操作是不允許的。
(7). 泛型類最好不要同數組一塊使用。你隻能創建new List<?>[10]這樣的數組,無法創建new List<String>[10]這樣的。這限製了數組的使用能力,而且會帶來很多費解的問題。因此,當需要類似數組的功能時候,使用集合類即可。
二. 序列化
(1). 如何有選擇的進行對象圖的序列化,Transient? serialPersistentFields?
(2). 安全性問題? 從不同的層次來加強序列化的安全性。
Ⅰ.對序列化之後的流進行加密。這可以通過CipherOutputStream來實現。
Ⅱ.實現自己的writeObject和readObject方法,在調用defaultWriteObject之前,先對要序列化的域的值進行加密處理。
Ⅲ.使用一個SignedObject或SealedObject來封裝當前對象,用SignedObject或SealedObject進行序列化。
Ⅳ.在從流中進行反序列化的時候,可以通過ObjectInputStream的registerValidation方法添加ObjectInputValidation接口的實現,用來驗證反序列化之後得到的對象是否合法。
三. Proxy
動態生成的代理類有如下一些特點:
(1). 包:如果所代理的接口都是 public 的,那麼它將被定義在頂層包(即包路徑為空),如果所代理的接口中有非 public 的接口(因為接口不能被定義為 protect 或 private,所以除 public 之外就是默認的 package 訪問級別),那麼它將被定義在該接口所在包,這樣設計的目的是為了最大程度的保證動態代理類不會因為包管理的問題而無法被成功定義並訪問;
(2). 類修飾符:該代理類具有 final 和 public 修飾符,意味著它可以被所有的類訪問,但是不能被再度繼承;
(3). 類名:格式是“$ProxyN”,其中 N 是一個逐一遞增的阿拉伯數字,代表 Proxy 類第 N 次生成的動態代理類,值得注意的一點是,並不是每次調用 Proxy 的靜態方法創建動態代理類都會使得 N 值增加,原因是如果對同一組接口(包括接口排列的順序相同)試圖重複創建動態代理類,它會很聰明地返回先前已經創建好的代理類的類對象,而不會再嚐試去創建一個全新的代理類,這樣可以節省不必要的代碼重複生成,提高了代理類的創建效率.
由此可見,受限於 Java 的語言的類繼承機製,動態代理機製也有其局限,如它不能支持:
(1). 聲明為 final 的類;
(2). 聲明為 final 的函數;
(3). 構造函數均為 private 類型的類。
要是我非要代理這些類呢? 別急,後麵會有字節碼操作大餐。。。
參考文獻:
1. https://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html
2. https://download.oracle.com/javase/6/docs/platform/rmi/spec/rmiTOC.html
3. https://tutorials.jenkov.com/java-exception-handling/index.html
最後更新:2017-04-02 16:48:03