<h1 class="pgc-h-arrow-right" data-track="1">場景</h1>
有探索欲的同學,應該會跟我一樣,在看JDK源碼時,跟到最後,會出現native方法,類似下面這個方法
看到這個native ,說明已經挖到核心了,到了這一步,還是不清楚是怎麼擷取系統的預設時區的,那怎麼辦,JDK代碼隻能跟到這裡。
轉戰OpenJDK,源碼下載下傳方式:gitee.com/mirrors/ope…
<h1 class="pgc-h-arrow-right" data-track="6">什麼是native</h1>
native是一個計算機函數,一個Native Method就是一個Java調用非Java代碼的接口。方法的實作由非Java語言實作,比如C或C++。
<h1 class="pgc-h-arrow-right" data-track="8">native的源碼怎麼看呢</h1>
以**private static native String getSystemTimeZoneID(String javaHome)**為例
如圖所示,找到TimeZone.c下的getSystemTimeZoneID方法

重點:調用不同平台相關的映射函數
去查找findJavaTZ_md方法時,發現存在分别在solaris和windows兩個目錄下。
查了下這兩個目錄的差别:
簡單的了解就是:
window系統下,使用windows目錄下編譯的JDK代碼
unix系的平台下,使用solaris目錄下編譯的JDK代碼
<h1 class="pgc-h-arrow-right" data-track="21">了解不同系統下findJavaTZ_md方法執行</h1>
<h1 class="pgc-h-arrow-right" data-track="22">windows系統</h1>
注釋寫得很清楚,擷取“Time Zones”系統資料庫中的目前時區
時區的設定方式:
那時區上的選擇值是從哪取到的,上面有說了,是在系統資料庫中取值
打開系統資料庫 :Regedit-->
<h1 class="pgc-h-arrow-right" data-track="30">unix系的平台</h1>
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