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