java System類解析
System類是一個由final修飾的類,所以無法被繼承,只有一個私有的構造器,所以也無法例項化。
System類所有的屬性和方法都是公有 static修飾的,可以由類名直接呼叫
屬性:
InputStream in; 輸入流
PrintStream out; 列印輸出流
PrintStream err; 標準錯誤列印輸出流,該留已經開啟,隨時準備接受輸出資料
SecurityManager security; java安全管理器
Console cons; 控制檯,用於從控制檯或裝置讀取字串,一般是使用者名稱密碼,尤其是密碼是不可見的
Properties props ; 系統屬性資料,java預設55條屬性,其中包括專案使用者執行環境檔案路徑以及換行符等
方法:
1、native void registerNatives();
該方法在類載入時執行。
System類存在靜態塊
private static native void registerNatives();
static {
registerNatives();
}
根據註釋,該方法被執行,jvm會自動呼叫 initializeSystemClass()方法。而initializeSystemClass方法會將以上輸入流,列印輸出流,以及安全管理器等屬性賦值。在實際應用中我們用到的System.out.println(),就是呼叫System類中的out列印輸出流的println()方法,列印各種資料。
2、setIn(InputStream in)
對類靜態變數屬性 in 賦值。在System類載入時,會自動呼叫該方法,建立預設的輸入流,內部呼叫checkIO()方法,標識java安全管理器會校驗操作許可權
3、setOut(PrintStream out);
對類靜態屬性out賦值,和setIn(InputStream in);方法類似,都會執行相同的操作
4、setErr(PrintStream err);
賦值靜態變數屬性err。 和上面setOut(PrintStream out);類似
5、console();
用於構建預設的控制檯物件,賦值給變數cons,一般idea是獲取不到console的,因為沒有控制檯,需要在cmd控制檯執行程式
6、Channel inheritedChannel() throws IOException;
返回建立類實體的通道 ---java虛擬機器
7、checkIO();
java安全管理器校驗流操作
8、native void setIn0(InputStream in);
由jvm對輸入流進行賦值
9、native void setOut0(PrintStream in);
和setIn0()類似
10、native void setErr0(PrintStream in);
和setErr0()類似
11、setSecurityManager(final SecurityManager s);
自定義java安全管理器
12、setSecurityManager0(final SecurityManager s);
自定義java安全管理器,同步方法,
13、getSecurityManager();
獲取java安全管理器
14、native long currentTimeMillis();
獲取系統當前時間,毫秒,注意:不同的作業系統對毫秒的測量單位不一樣
15、native long nanoTime();
獲取當前系統時間 納秒為單位 注意:1納秒 = 1毫秒 *1000 * 1000
16、native void arraycopy(object src , int srcPos , object dest , int destPos , int length);
複製陣列
引數: src:被複制的陣列; srcPos:指定複製索引,從哪個索引開始複製。desc:複製的陣列。destPos:從複製陣列中哪個索引開始拷貝。length:複製幾個元素
比如:
String[] arr = new String[]{"1","2","3","4"};
String[] arr1= new String[]{"5","6","7","8"};
System.arraycopy(arr,1,arr1,0,2);
含義:從陣列arr的索引1開始(第二個元素開始)複製,複製2個元素,拷貝到陣列arr1,從索引0開始拷貝(第一個元素開始拷貝)。執行完成後,會發現arr1陣列的值變成 2 3 7 8
注意:如果如果length長度引數數值大於可複製陣列長度,或者為負數,則會丟擲ArrayIndexoutofBoundException異常
17、native int identityHashCode(Object x);
返回物件的hashCode值。注意:不管該物件有沒有重寫hashCode()方法,返回的hashCode值都是根據物件實體記憶體地址產生的hash值。
此處多說一下hashCode()方法和identityHashCode(Object x);的區別
hashCode();方法返回的是物件重寫hashCode後的hashCode值,如果沒有重寫hashCode,則返回的值和IdentityHashCode是一樣的。
identityHashCode(Object x);返回的永遠是物件的hash初始值,就是實體記憶體地址產生的hash值
18、Properties getProperties();
獲取系統屬性資料 預設系統屬性有55種。
19、String lineSeparator();
返回與作業系統相關的行分隔符字串,一般返回的值都一樣。 分隔符字串,在系統類載入時,jvm會自動獲取當前作業系統預設的換行符。
這裡需要注意的是,在實際開發中常常會用到換行,介意不要直接用 "\n\r" 寫死,因為在不同的作業系統中換行符可能是不同的,如果寫死。就實現不了java的跨平臺可移植性。 這裡介意用 lineSeparator();方法或者用System.getProperty("line.separator");獲取換行符
20、setProperties(Properties props);
設定系統屬性,這裡需要謹慎使用。因為一旦自定義系統屬性後,會自動替換掉原先的屬性列表。
21、 String getProperty(String key);
通過指定key值,獲取系統屬性value值
22、String getProperty(String key,String def);
通過指定key值,獲取系統屬性value值,如果獲取不到,使用預設值def。
23、String setProperty(String key,String value);
向系統屬性中新增屬性資訊
24、clearProperty(String key);
刪除指定key值的系統屬性資訊
25、Map<String,String> getenv();
獲取當前作業系統中,所有配置的環境變數
26、String getenv(String name);
通過指定環境變數名稱,獲取當前系統中的環境變數值。
27、exit(int status);
終止java虛擬機器,status標識狀態,不是0標識異常終止 Runtime.getRuntime().exit(int status);
28、gc();
執行垃圾回收,建議java虛擬機器花費精力回收未被使用的物件,以便使這些佔據的記憶體快速得到重用。
29、runFinalization();
執行處於終止狀態的所有物件的終止方法,由於java虛擬機器做了努力執行被丟棄物件的finalize()方法,但是由於沒寫原因,這些方法卻並沒有被執行。執行runFinalization();方法可以將被丟棄終止狀態的物件最大程度的執行終止方法。
30、load(String filename);
裝在庫檔案,放置庫檔案的絕對路徑
31、loadLibary(String libName);
裝在庫,引數為庫檔名
32、native String mapLibaryName(String libName)
將庫名對映為特定平臺的字串