โปรแกรมจาวาทั้งหมดทำงานบน 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