天天看點

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

<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方法

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台
要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

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

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

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

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

簡單的了解就是:

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”系統資料庫中的目前時區

時區的設定方式:

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

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

打開系統資料庫 :Regedit--&gt;

<h1 class="pgc-h-arrow-right" data-track="30">unix系的平台</h1>

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

步驟:

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

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

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

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

修改時區

要探索JDK的核心底層源碼,那必須掌握native用法場景什麼是nativenative的源碼怎麼看呢了解不同系統下findJavaTZ_md方法執行windows系統unix系的平台

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

4、傳回到GMT

繼續閱讀