System是一個類,這個System類主要是一些與系統相關的屬性和方法的集合,而且其內部的方法全部是靜態的,所以我們直接使用System直接調用就好,比如我們常用的一個System.out.print。這篇文章我們就來分析一下System類。
一、System概述
System就是系統的意思。因此它的主要操作肯定也是和系統信息有關。這個類位于JAVA.lang包??赡芪覀兌加幸粋€疑惑,我們從來沒見過System被實例化,這是因為System類內部的構造函數是私有的,在外部不能訪問,因此也就不能被實例化了。
他主要有如下功能:
(1)系統信息的訪問,如外部屬性和環境變量等
(2)垃圾回收相關操作
(3)標準輸入輸出
(4)比較常用的其他操作,比如數組拷貝
接下來我們就對這些功能進行一個測試與描述:
二、System功能演示
1、獲取設置屬性方法
也就是說我們的System如何獲取系統的屬性,或者說是調用哪個方法獲取屬性。
(1)contains(Object value)、containsKey(Object key):判斷給定的參數或屬性關鍵字在屬性表中有定義,返回True或者False;
(2)getProperty(String key)、getProperty(String key, String default):根據參數獲取屬性
(3)list(PrintStream s)、list(PrintWriter w): 在輸出流中輸出屬性表內容;
(4)size():返回當前屬性表中定義的屬性關鍵字個數。
我們當然可以設置屬性:
(1)put(Object key, Object value) :向屬性表中追加屬性關鍵字和關鍵字的值;
(2)remove(Object key) :從屬性表中刪除關鍵字。
2、獲取系統屬性
上面我們可以直接使用System.contains等方法來調用,下面我們可以輸入以下參數來獲取系統信息。
然后使用代碼測試以下幾個比較典型的吧:
當然運行一下我們的控制臺就有結果了:
在這里只是挑選了一部分進行測試,參數已經列出來了,其他的可以自己測。
三、常見操作
1、拷貝數組arraycopy
2、獲取系統時間
四、垃圾回收相關操作:System.gc
這句話表明運行了垃圾回收器。java虛擬機會回收一下系統垃圾,比如說沒有使用的對象。
我們看一下運行結果再來分析
我們可以看到,在進行完垃圾回收之后,再輸入User相關信息時由于找不到對象,因此報了空指針異常。
我們進入到System.gc內部看一下,看看內部執行了什么操作,
在這里我們可以看到其實是執行了Runtime的垃圾回收操作。我們在進入會發現其實垃圾回收就是Runtime做的。
五、源碼分析
1、初始化
我們進入到System的源碼中,可以看到首先由這樣的描述:
上面是什么意思呢?
首先:registerNatives()方法是一個入口方法,注冊成了natives,也就是說該方法會令vm通過調用initializeSystemClass方法來完成初始化工作。
然后:構造函數被設置成private,說明我們不能實例化這個類,注釋也已經說明了。
既然System初始化的操作是通過initializeSystemClass,我們不如進入到這個類中去看看。
通過initializeSystemClass,我們已經能夠明白System是如何初始化的,對于每一步,我們可以繼續深入下去觀察其具體實現,在這里就不贅述了。
2、類屬性
類屬性其實主要是輸入輸出流
3、類方法
在這里肯定不能所有的方法都講一遍,在這里列舉幾個比較重要的方法。
(1)getProperty:獲取系統屬性
我們在這里發現,其實獲取屬性的操作最關鍵的就是最后一句props.getProperty(key)。我們進入到這個方法看看:
也就是說其實是 一直是回調defaults.getProperty(key),讓父類一直不停的去調用。最后返回一個String。
(2)checkKey:校驗key
里面很簡單就是看看是否為空。
(3)setProperties:設置系統屬性
最核心的就是最后一行,但是前面首先檢驗了是否是系統安全的屬性,而且也根據這個屬性初始化了一次。我們進入initProperties。
這是一個native方法。
(4)exit():退出當前的jvm
其實調用的也是runtime的退出方法。
(5)其他方法
我們會發現經常操作的這些方法其實也是native的。
(6)安全管理機制
與之相關的方法有三個
第二個:
還有最后一個
OK。源碼分析也就先說到這里,對于System類要知道其基本的內部實現以及常用的操作即可。