【ความรู้เบื้องต้นเกี่ยวกับคลาสโหลด】】
classloader ใช้สำหรับโหลดไฟล์คลาสลงในเครื่องเสมือน JVM มีตัวโหลดสามประเภทใน JVM, bootstrap class loader, ตัวโหลดคลาสส่วนขยายและตัวโหลดคลาสแอปพลิเคชัน นอกจากนี้คุณยังสามารถสืบทอดคลาส java.lang.classloader เพื่อสร้างตัวโหลดที่กำหนดเอง
【ประเภทตัวโหลดคลาส】
1. Bootstrap: ไม่ใช่คลาส Java มันถูกเขียนขึ้นใน C ++ ซึ่งฝังอยู่ในเคอร์เนล JVM และใช้เรียกการดำเนินการรหัสแบบดั้งเดิมโดยใช้ JNI (JavanativeInterface) ตัวโหลดคลาสบูตมีหน้าที่ในการโหลดไลบรารีคลาส Java Core เช่นไฟล์ rt.jar ภายใต้ Java_home/jre/lib ไฟล์ jar นี้มีคลาสทั่วไปบางส่วนเช่น:
java.lang.system java.util.hashmap
2. extclassloader: สืบทอดมาจากคลาส java.lang.classloader, ใช้ในการโหลดไฟล์ JAR ด้านล่างเส้นทางส่วนขยายเส้นทางส่วนขยายคือ Java_home/JRE/LIB/EXT
3. แอปพลิเคชันคลาสโหลดเดอร์ (AppClassLoader): สืบทอดมาจากคลาส java.lang.classloader ที่ใช้ในการโหลดคลาสด้านล่าง ClassPath หัวเราะออกมาดัง ๆ
【กลไกการมอบหมายของตัวโหลดคลาส】
1. เมื่อแอปพลิเคชันต้องการโหลดคลาสไฟล์ bytecode ของคลาสที่ต้องการจะถูกโหลดภายใต้พา ธ ที่สอดคล้องกันในลำดับของ bootstrap, extclassloader และ appclassloader
2. เราสามารถรวบรวมคลาสที่กำหนดเองลงในไฟล์คลาสและพิมพ์ลงในแพ็คเกจ Jar และวางไว้ในเส้นทาง Java_home/JRE/LIB/EXT เมื่อโหลดตัวโหลดคลาสจะถูกโหลดจากเส้นทาง Java_Home/JRE/LIB/EXT โดยใช้ตัวโหลด extClassLoader และจะไม่ถูกโหลดภายใต้ classPath โดยใช้ตัวโหลด AppClassLoader
3. หลังจากใช้ตัวโหลดคลาสตามลำดับของ bootstrap, extclassloader, appclassloader และไม่สามารถโหลดคลาสได้
【การสาธิตแอปพลิเคชัน】
1. bootstrap: เขียนใน C ++ ฝังอยู่ในเคอร์เนล JVM ไม่ใช่คลาส Java
classloader loader = system.class.getClassLoader (); System.out.println (โหลด); //โมฆะ
2. AppClassLoader: ใช้ AppClassLoader loader เพื่อโหลดคลาสด้านล่าง classpath
classloader loader = classloaderTest.class.getClassLoader (); System.out.println (loader.getClass (). getName ()); //sun.misc.launcher$AppClassloader
3. extclassloader: ใช้ในการโหลดคลาส Java ภายใต้เส้นทาง Java_Home/JRE/LIB/EXT เมื่อพบแล้วมันจะไม่ถูกโหลดใน classpath
เขียนคลาส Hello Custom ให้พิมพ์ลงในแพ็คเกจ Jar และส่งออกไปยัง C: /programfiles/java/jdk1.7.0/jre/lib/ext/excelsoft.jar Path
classloader loader = hello.class.getClassLoader (); System.out.println (loader.getClass (). getName ()); //sun.misc.launcher$extclassloader
-
รถตักคลาสเป็นหัวข้อที่ค่อนข้างซับซ้อนเพียงเพื่อการแนะนำ!
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการวิเคราะห์พื้นฐานของตัวโหลดคลาส JVM และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!