摘要:要探索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方法

重點:調用不同平台相關的映射函數
去查找findJavaTZ_md方法時,發現存在分别在solaris和windows兩個目錄下。
查了下這兩個目錄的差别:
簡單的了解就是:
window系統下,使用windows目錄下編譯的JDK代碼
unix系的平台下,使用solaris目錄下編譯的JDK代碼
時區的設定方式:
那時區上的選擇值是從哪取到的,上面有說了,是在系統資料庫中取值
打開系統資料庫 :Regedit–>
findJavaTz_md()方法的注釋上寫得很清楚了:将平台時區ID映射為Java時區ID
步驟:
1、使用< Java home>/lib/tzmappings,。如果沒有找到"TZ"變量,就進行第2步
2、 tz = getPlatformTimeZoneID(); 執行Linux特定的映射,如果找到,傳回一個時區ID,否則傳回null
【Linux】Centos7修改系統時區timezone方式:
修改時區
3、對比/etc/localtime與"/usr/share/zoneinfo目錄下的檔案,如果一緻,就傳回時區ID,沒有則到第4步
4、傳回到GMT
點選關注,第一時間了解華為雲新鮮技術~