一塊兒學Java7新功能擴展——深刻歷險分享(一)

    特此聲明:因網友疑問,這裏聲明一個重要的安全,就是你們所知的java驚現0day漏洞!8月30日,Oralce緊急發佈了新版本的JDK和JRE,緣由是發現了一個嚴重的0day漏洞CVE-2012-4681,遠程攻擊者能夠經過它繞開SecurityManager的限制執行代碼!國內的Freebuf在分析惡意代碼時發現了其中有這樣一段代碼,即「我有一隻小毛驢,歷來也不騎」。html

String k1 = "woyouyizhixiaomaol"; String k2 = "conglaiyebuqi";

若是對該漏洞感興趣的童鞋請點擊(http://www.freebuf.com/vuls/5485.html國內、http://www.deependresearch.org/2012/08/java-7-vulnerability-analysis.html這個爲國外分析)該漏洞通常針對的是applet,國內不多有這樣的應用了!(即便有估計也沒有幾我的挖空心思搞你一個我的電腦!沒意義!信息盜賣已經不是新聞了!)國外彷佛還有!建議在瀏覽器中使用Java的同窗馬上將本身的Java升級到7u7或6u35版本java



一:java7語言擴展的簡介數據庫

20117月,在時隔數年以後,java的一個重大版本javase7發佈了。在這個新的版本中,java平臺新增了不少的新的特性。在java虛擬機方面,invokedynamic指令的加入使虛擬機上的動態語言的性能獲得了很大的提高。這使得開發人員能夠享受到動態語言帶來的在提升生產效率方面的好處。在java語言方面,語言自己的進一步簡化,使開發人員編寫代碼的效率更高。在java類庫方面,新的IO庫和同步實現工具類爲開發人員提供了更多的實現功能。從另一個角度來講,javase7oracle公司領導力的顧慮。Javase7的發佈也證實了jcpopenjdk的社區驅動模式能夠很好地推進java向前發展。數組

         隨着新版本的發佈,確定會有愈來愈多的開發人員想嘗試使用javase7中的新特性,畢竟開發者社區對這個新版本的期待了太長的時間。在java程序中使用這些新特性,能夠提升代碼質量,提高工做效率。Java平臺的每一個版本都致力於提升java程序的運行性能。同時隨着新版本的發佈,企業都應該考慮把java程序的運行平臺升級到最新的javase7,這樣能夠享受到性能提高所帶來的好處。對於新的java程序開發,推薦使用javase7做爲標準的運行平臺。瀏覽器

         在介紹具體的新特性以前,有必要介紹一下coin項目。OpenJDK中的Coin項目的目的是維護對java語言所作的語法加強。在Coin項目開始之初,曾經普遍地向社區徵求提議。在短短一個月時間內就收到了近70條提議。最後有9條提議被列入考慮之中。在這9條提議中,有6條成爲java7的一部分,剩下的6提議會在java8中從新考慮,還有1條提議被移到其餘項目中實現。這6條被接納的提議除了switch語句中使用字符串、數值字面的改進、優化的異常處理、try-with-resources語句和優化變長參數的方法調用以外還有簡化泛型類建立的「<>」操做符。在java8中考慮2條提議則分別是集合類字面量和爲ListMap提供相似數組的按序號的訪問方式。安全

         和其餘對java平臺所作的修改同樣,Coin項目所建議的修改也須要經過JCP來完成。這些改動以JSR334(Small Enhancements to the Java)oracle

         二:java7 switch特性介紹app

今天首先來讓咱們看看耳熟能詳的switch是如何被提高擴展對字符串的支持的!你們都知道在java7以前switch語句中的條件表達式的類型只能是與整數類型兼容的類型,包括基本類型charbyteshortint,與這些基本類型對應的封裝類型CharacterByteShortInteger,還有枚舉類型。這樣的限制下降了語言的靈活性,使開發人員在須要根據其餘類型的表達式來進行條件選擇時,不得不增長額外的代碼來繞過這個限制。爲此java7放寬了這個限制,額外增長了一種能夠在switch語句中使用的表達式類型,那就是很常見的字符串,即String類型eclipse

         三:java7switch用法模塊化

                   在基本java7的代碼中使用這個新特性很是簡單,由於這個新特性並無改變switch的語法含義,只是多了一種開發人員能夠選擇的條件判斷的數據類型。可是這個簡單的新特性卻帶來了重大的影響,由於根據字符串進行條件判斷在開發中是很常見的。

                   下面來看看java7中根據字符串進行條件判斷【Test】:

 

public class Test {
         public String getTitle(String name,String sex){

                   String title ="";

                   switch(sex){

                            case "男":

                                     title=name+"\t it man";

                                     break;

                            case "女":

                                     title=name+"\t it woman";

                                     break;

                            default:

                                     title=name+"變形金剛";

                   }

                   return title;

         }

         public static void main(String[] args) {

                   System.out.println(new Test().getTitle("Dobby", "男"));

         }

}

 

運行結果:

    PS:switch語句中,表達式的值是不能是null,不然會在運行時拋出NullPointerException,case子句中也不能使用null,不然會出現編譯錯誤。

         看到這裏或許你以爲這個沒什麼嘛就是一個簡單的switch,你彆着急接下來就是switch的深度歷險了,讓咱們看看他是如何實現switch接受String類型的!根據switch語句的語法要求,其case子句的值是不能重複的,這個要求對字符串類型的條件表達式一樣適用。不過對於字符串來講這種重複值的檢查還有一個特殊之處,就是java代碼中的字符串能夠包含Unicode轉義字符。重複值的檢查是在java編譯器對java源碼進行相關的語法轉換以後才進行的。這個語法轉換過程當中包括了對Unicode轉義字符的處理。也就是說,有些case子句的值雖然在源碼中看起來是不一樣的,可是通過轉換後是同樣的,這個就會形成編譯錯誤。

修改上面的代碼再執行看看以下修改(使用jdk自帶的native2ascii.exe將「女」轉換成Unicode)

public String getTitle(String name,String sex){
		String title ="";
		switch(sex){
			case "男":
				title=name+"\t it man";
				break;
			case "\u7537":
				title=name+"\t it woman";
                                break;
			default:
				title=name+"變形金剛";
		}
		
		return title;
	}

當咱們再次編譯的時候就會不經過,報出標籤重複錯誤!


這是由於其中的switch語句中的兩個case子句所使用的值「男」和「\u7537」在通過轉義以後變成同樣的。「\u7537」是「男」的Unicode轉義字符形式。

.java7 switch實現原理

         說了這麼多下面讓咱們來看看switch到底是如何實現的呢!實際上,這個新特性是在編譯器這個層次上實現的。而在java虛擬機和字節碼這個層次上,仍是隻支持在switch語句中使用與整數類型兼容的類型。這麼作的目的是爲了減小這個特性所影響的範圍,以下降實現的代價。在編譯器層次實現的含義是,雖然開發人員在java源碼的switch語句中使用了字符串類型,可是編譯的過程當中,編譯器會根據源代碼的含義來進行轉換,將字符串類型轉換成與整數兼容的格式。不一樣的java編譯器可能採用不一樣的方式來完成這個轉換,並採用不一樣的優化策略。好比:若是switch子句中只包含一個case子句,那麼能夠簡單的將其轉換成一個if語句。若是switch語句中包含一個case子句和一個default子句,那麼能夠將其轉換成if-else語句。而對於最複雜的狀況,只不過使用字符串的哈希值做爲switch語句的表達式的值。

         爲了驗證剛剛的理論同時咱們也探究OpenJDK中的java編譯器使用的是什麼樣的轉換方式,須要一個名爲JAD的工具,這個工具能夠把javaclass文件反編譯成java源碼,下面咱們使用JAD把剛剛的Test.class文件反編譯。在對編譯生成Test類的class文件使用了JAD以後,所獲得的內容以下:


從上面的代碼中能夠看出,原來用在switch語句中的字符串被替換成了對應的哈希值,而case子句的值也被替換成原來字符串經常使用的哈希值。通過這樣的轉換,java虛擬機所看到的仍然是與整數類型兼容的類型。在這裏值得注意的是,在case子句對應的語句塊中仍然須要使用Stringequals方法來進行字符串比較。這是由於哈希函數在映射的時候可能存在衝突,多個字符串的哈希值多是同樣的。進行字符串比較是爲了保證轉換以後的代碼邏輯與以前徹底同樣!

         好了今日曆險到此,java7裏面的變革仍是很大的這裏就先分享一則!後面基本分爲有如下方面:

1.      語法新特性:對數值字面量的改進、優化的異常處理、try-with-resources語句、優化變長參數的方法調用、

2.      Java語言的動態性:腳本語言支持API、反射API、動態代理、動態語言支持、

3.      Java7其餘重要更新:關係數據庫訪問、javalang包更新、java實用工具類、JavaBeans組件

4.      超越java7lambda表達式、java平臺模塊化、javaSe8的其餘更新

 

    想必你們機子上必定更新到 java7 了吧!只是沒有幾我的用過吧!接下來就是本身動手歷險的時候了!實踐是檢驗真理的惟一標準!(若是沒有的本身能夠到 oracle 官方下載 java7 jdk )這裏透露一下哦, eclipse 最新版也已經集成了 java7 能夠到官方下載,不過默認的仍是 6 的版本,本身建立項目的時候能夠選擇,若是發現能夠 jre 沒有集成, 本身能夠添加 java7 jre eclipse 就可使用了!好了初試 java7 到此結束!後面慢慢在學習!
相關文章
相關標籤/搜索