Java 9 中類載入器的變化是什麼?


所有 Java 程式都執行在 **Java 虛擬機器 (JVM)** 上。編譯後,Java 類會轉換為 **平臺** 和 **機器無關的位元組碼**,編譯後的類儲存為 **.class** 檔案。每當我們嘗試使用它時,**類載入器** 會將該類載入到記憶體中。當類透過名稱被引用時,這些類就會被引入 Java 環境。類的載入是由類載入器完成的,一旦類開始執行,**main()** 方法就是啟動該類的方法。

Java 9 中類載入器有一些細微的變化

  • **系統類載入器** 在 Java 9 中不再存在,它不再是 **URLClassLoader** 的例項,而是一個內部類。它是模組中類的 **預設載入器**。
  • **擴充套件類載入器** 已重新命名為 **平臺類載入器**。所有 Java SE 平臺中的類都可以透過平臺類載入器訪問,Java 社群程序下的模組中的類(但不是 Java SE 平臺的一部分)也可以透過平臺類載入器訪問。
  • **應用程式** 不能依賴於定義某些 Java SE 平臺類所在的類載入器,其中一些類由平臺類載入器定義,而另一些類由 **引導類載入器** 定義。
  • 如果現有程式碼建立的類載入器以引導類載入器作為父類載入器,則需要更改為使用平臺類載入器作為父類載入器。
  • **平臺類載入器** 不是 **URLClassLoader** 的例項,而是一個內部類。
  • **引導類載入器** 是 JVM 的 **內建類載入器**。但是,它定義了關鍵模組(例如 **base**)的類。使用 **-Xbootclasspath/a** 部署的應用程式或建立以 **null** 作為 **父類載入器** 的類載入器可能需要更改。

示例

public class ClassLoaderTest {
   public static void main(String args[]) {
      System.out.println("Class Loader Test");
      ClassLoaderTest test = new ClassLoaderTest();
      try {
         test.showClassLoaders();
      } catch(ClassNotFoundException cnfe) {
         System.out.println(cnfe.getMessage());
      }
   }
   public void showClassLoaders() throws ClassNotFoundException {
      System.out.println("Classloader of this class: " + ClassLoaderTest.class.getClassLoader());
      System.out.println("Classloader of Permission: " + java.sql.SQLPermission.class.getClassLoader());
      System.out.println("Classloader of LinkedList: " + java.util.LinkedList.class.getClassLoader());
      return;
   }
}

輸出

Class Loader Test
Classloader of this class: jdk.internal.loader.ClassLoaders$AppClassLoader@504bae78
Classloader of Permission: jdk.internal.loader.ClassLoaders$PlatformClassLoader@299a06ac
Classloader of LinkedList: null

更新於:2020年4月29日

777 次瀏覽

啟動你的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.