天天看點

帶你掌握不同平台下,探索JDK源碼所需的native方法

摘要:要探索JDK的核心底層源碼,那必須掌握native用法。文章中會以“擷取系統的預設時區”為例,介紹說明如何檢視native對應方法的源碼。

本文分享自華為雲社群《要探索JDK的核心底層源碼,那必須掌握native用法》,作者: 小虛竹 。

有探索欲的同學,應該會跟我一樣,在看JDK源碼時,跟到最後,會出現native方法,類似下面這個方法

看到這個native ,說明已經挖到核心了,到了這一步,還是不清楚是怎麼擷取系統的預設時區的,那怎麼辦,JDK代碼隻能跟到這裡。

轉戰OpenJDK,源碼下載下傳方式:https://gitee.com/mirrors/openjdk

native是一個計算機函數,一個Native Method就是一個Java調用非Java代碼的接口。方法的實作由非Java語言實作,比如C或C++。

以**private static native String getSystemTimeZoneID(String javaHome)**為例

如圖所示,找到TimeZone.c下的getSystemTimeZoneID方法

帶你掌握不同平台下,探索JDK源碼所需的native方法
帶你掌握不同平台下,探索JDK源碼所需的native方法

重點:調用不同平台相關的映射函數

去查找findJavaTZ_md方法時,發現存在分别在solaris和windows兩個目錄下。

帶你掌握不同平台下,探索JDK源碼所需的native方法

查了下這兩個目錄的差别:

簡單的了解就是:

window系統下,使用windows目錄下編譯的JDK代碼

unix系的平台下,使用solaris目錄下編譯的JDK代碼

時區的設定方式:

帶你掌握不同平台下,探索JDK源碼所需的native方法

那時區上的選擇值是從哪取到的,上面有說了,是在系統資料庫中取值

打開系統資料庫 :Regedit–>

findJavaTz_md()方法的注釋上寫得很清楚了:将平台時區ID映射為Java時區ID

步驟:

1、使用< Java home>/lib/tzmappings,。如果沒有找到"TZ"變量,就進行第2步

2、 tz = getPlatformTimeZoneID(); 執行Linux特定的映射,如果找到,傳回一個時區ID,否則傳回null

【Linux】Centos7修改系統時區timezone方式:

帶你掌握不同平台下,探索JDK源碼所需的native方法

修改時區

帶你掌握不同平台下,探索JDK源碼所需的native方法

3、對比/etc/localtime與"/usr/share/zoneinfo目錄下的檔案,如果一緻,就傳回時區ID,沒有則到第4步

4、傳回到GMT

點選關注,第一時間了解華為雲新鮮技術~

上一篇: 反射