Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

การเปลี่ยนแปลงของตัวโหลดคลาสใน Java 9 คืออะไร?


โปรแกรมจาวาทั้งหมดทำงานบน Java Virtual Machine (JVM) . หลังจากคอมไพล์แล้ว คลาส java จะถูกแปลงเป็น แพลตฟอร์ม และ ไบต์โค้ดที่ไม่ขึ้นกับเครื่อง และคลาสที่คอมไพล์แล้วจะถูกเก็บไว้เป็น .class ไฟล์. เมื่อใดก็ตามที่เราพยายามใช้งาน ClassLoader โหลดคลาสนั้นลงในหน่วยความจำ คลาสได้รับการแนะนำในสภาพแวดล้อม Java เมื่อมีการอ้างอิงตามชื่อ การโหลดคลาสเสร็จสิ้นโดยตัวโหลดคลาส เมื่อคลาสเริ่มทำงาน และ main() method เป็นวิธีการเริ่มต้นคลาสนั้น

มีการเปลี่ยนแปลงเล็กน้อยของตัวโหลดคลาสใน Java 9:

  • ตัวโหลดคลาสระบบ ไม่มีอีกต่อไปใน Java 9 อินสแตนซ์ของ URLClassLoader ค่อนข้างเป็นคลาสภายใน มันคือ ตัวโหลดเริ่มต้น สำหรับคลาสในโมดูล
  • ตัวโหลดคลาสส่วนขยาย ได้เปลี่ยนชื่อเป็น ตัวโหลดคลาสแพลตฟอร์ม . คลาสทั้งหมดในแพลตฟอร์ม Java SE สามารถมองเห็นได้ผ่านตัวโหลดคลาสแพลตฟอร์ม และคลาสในโมดูลภายใต้กระบวนการชุมชน Java แต่จะไม่มองเห็นส่วนหนึ่งของแพลตฟอร์ม Java SE ผ่านตัวโหลดคลาสของแพลตฟอร์มด้วย
  • แอพพลิเคชั่น ไม่สามารถพึ่งพาตัวโหลดคลาสที่กำหนดว่าคลาสแพลตฟอร์มใดของคลาสบางคลาสใน Java SE Platform ถูกกำหนดโดยตัวโหลดคลาสของแพลตฟอร์ม ในขณะที่ตัวโหลดคลาสอื่นๆ ถูกกำหนดโดย ตัวโหลดคลาสbootstrap .
  • หากโค้ดที่มีอยู่สร้าง class loader โดยมี bootstrap class loader เป็นตัวโหลด parent class เราก็จำเป็นต้องเปลี่ยนไปใช้ platform class loader เป็นพาเรนต์
  • ตัวโหลดคลาสแพลตฟอร์ม ไม่ใช่ตัวอย่างของ URLClassLoader ค่อนข้างเป็นคลาสภายใน
  • ตัวโหลดคลาสบูตสแตรป เป็น ตัวโหลดคลาสในตัว ของเจวีเอ็ม อย่างไรก็ตาม มันกำหนดคลาสของโมดูลที่สำคัญ เช่น ฐาน . แอปพลิเคชันที่ปรับใช้ด้วย -Xbootclasspath/a หรือสร้าง class loader ด้วย 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