นำมาจากบทช่วยสอนที่ดีจาก Sun:
แรงจูงใจ
แอปพลิเคชันที่เขียนด้วยภาษาการเขียนโปรแกรมแบบคอมไพล์แบบคงที่เช่น C และ C ++ จะถูกรวบรวมเป็นคำสั่งพื้นฐานเฉพาะเครื่องและบันทึกเป็นไฟล์เรียกทำงาน กระบวนการในการรวมรหัสเข้ากับรหัสดั้งเดิมที่เรียกใช้งานได้เรียกว่าการเชื่อมโยง - การรวมรหัสที่คอมไพล์แยกต่างหากกับรหัสไลบรารีที่ใช้ร่วมกันเพื่อสร้างแอปพลิเคชันที่ปฏิบัติการได้ สิ่งนี้แตกต่างกันในภาษาการเขียนโปรแกรมที่คอมไพล์แบบไดนามิกเช่น Java ใน Java ไฟล์. class ที่สร้างโดยคอมไพเลอร์ Java จะยังคงเป็น - จนกว่าจะโหลดลงใน Java Virtual Machine (JVM) - กล่าวอีกนัยหนึ่งกระบวนการเชื่อมโยงจะดำเนินการโดย JVM เมื่อรันไทม์ คลาสถูกโหลดเข้าสู่ JVM บนพื้นฐาน 'ตามต้องการ' และเมื่อคลาสที่โหลดขึ้นอยู่กับคลาสอื่นคลาสนั้นก็จะถูกโหลดเช่นกัน
เมื่อเปิดใช้งานแอปพลิเคชัน Java คลาสแรกที่เรียกใช้ (หรือจุดเข้าสู่แอปพลิเคชัน) เป็นแอปพลิเคชันที่มีช่องว่างแบบสแตติกสาธารณะที่เรียกว่า main () คลาสนี้มักจะมีการอ้างอิงไปยังคลาสอื่น ๆ และความพยายามทั้งหมดในการโหลดคลาสที่อ้างอิงจะดำเนินการโดยโหลดเดอร์ระดับ
ในการรับความรู้สึกของการโหลดคลาสแบบเรียกซ้ำรวมถึงแนวคิดการโหลดคลาสโดยทั่วไปให้พิจารณาคลาสง่าย ๆ ดังต่อไปนี้:
public class HelloApp {
public static void main(String argv[]) {
System.out.println("Aloha! Hello and Bye");
}
}
หากคุณรันคลาสนี้โดยระบุตัวเลือกบรรทัดคำสั่ง -verbose: class เพื่อให้มันพิมพ์คลาสใดที่กำลังโหลดคุณจะได้รับเอาต์พุตที่มีลักษณะดังนี้ โปรดทราบว่านี่เป็นเพียงเอาต์พุตบางส่วนเนื่องจากรายการยาวเกินไปที่จะแสดงที่นี่
prmpt>java -verbose:class HelloApp
[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]
อย่างที่คุณเห็นคลาสของรันไทม์ Java ที่แอปพลิเคชันต้องการ (HelloApp) จะถูกโหลดขึ้นมาก่อน
Class Loaders ในแพลตฟอร์ม Java 2
ภาษาการเขียนโปรแกรม Java พัฒนาอย่างต่อเนื่องเพื่อให้ชีวิตของนักพัฒนาแอปพลิเคชันง่ายขึ้นทุกวัน สิ่งนี้ทำได้โดยการให้ API ที่ทำให้ชีวิตของคุณง่ายขึ้นโดยให้คุณจดจ่อกับตรรกะทางธุรกิจมากกว่าใช้รายละเอียดของกลไกพื้นฐาน เรื่องนี้เห็นได้ชัดจากการเปลี่ยนแปลงล่าสุดของ J2SE 1.5 เป็น J2SE 5.0 เพื่อสะท้อนถึงความสมบูรณ์ของแพลตฟอร์ม Java
ตั้งแต่ JDK 1.2 ตัวโหลดคลาส bootstrap ที่สร้างขึ้นใน JVM มีหน้าที่โหลดคลาสของรันไทม์ Java ตัวโหลดคลาสนี้โหลดคลาสที่พบในบูทคลาสพา ธ เท่านั้นและเนื่องจากคลาสเหล่านี้เป็นคลาสที่เชื่อถือได้กระบวนการตรวจสอบจึงไม่ถูกดำเนินการเช่นเดียวกับคลาสที่ไม่น่าเชื่อถือ นอกเหนือจากตัวโหลดคลาส bootstrap แล้ว JVM ยังมีตัวโหลดคลาสส่วนขยายที่รับผิดชอบการโหลดคลาสจาก API ส่วนขยายมาตรฐานและตัวโหลดคลาสระบบที่โหลดคลาสจากพา ธ คลาสทั่วไปเช่นเดียวกับคลาสแอ็พพลิเคชันของคุณ
เนื่องจากมีตัวโหลดคลาสมากกว่าหนึ่งตัวจึงถูกแสดงในทรีที่มีรูทเป็นตัวโหลดคลาส bootstrap ตัวโหลดคลาสแต่ละตัวมีการอ้างอิงถึงตัวโหลดคลาสพาเรนต์ เมื่อคลาสโหลดเดอร์ถูกขอให้โหลดคลาสคลาสนั้นจะพิจารณาพาเรนต์คลาสโหลดเดอร์หลักก่อนพยายามโหลดไอเท็ม ผู้ปกครองในทางกลับกันให้คำปรึกษาผู้ปกครองของมันและอื่น ๆ ดังนั้นหลังจากตัวโหลดคลาสบรรพบุรุษทั้งหมดไม่สามารถค้นหาคลาสที่ตัวโหลดคลาสปัจจุบันเข้าร่วมได้ กล่าวอีกนัยหนึ่งจะใช้แบบจำลองการมอบหมาย
คลาส java.lang.ClassLoader
The java.lang.ClassLoader
เป็นคลาสนามธรรมที่สามารถ subclassed โดยแอ็พพลิเคชันที่ต้องการขยายลักษณะที่ JVM โหลดคลาสแบบไดนามิก ตัวสร้างในjava.lang.ClassLoader
(และคลาสย่อย) อนุญาตให้คุณระบุพาเรนต์เมื่อคุณสร้างอินสแตนซ์คลาสโหลดเดอร์ใหม่ หากคุณไม่ได้ระบุพาเรนต์อย่างชัดเจนตัวโหลดคลาสระบบของเครื่องเสมือนจะถูกกำหนดเป็นพาเรนต์เริ่มต้น กล่าวอีกนัยหนึ่งคลาส ClassLoader ใช้โมเดลการมอบหมายเพื่อค้นหาคลาสและทรัพยากร ดังนั้นแต่ละอินสแตนซ์ของ ClassLoader มีตัวโหลดคลาสพาเรนต์ที่เชื่อมโยงดังนั้นเมื่อถูกร้องขอให้ค้นหาคลาสหรือรีซอร์สงานจะถูกมอบหมายให้กับตัวโหลดคลาสพาเรนต์ก่อนที่จะพยายามค้นหาคลาสหรือรีซอร์สเอง loadClass()
วิธีการ ClassLoader ดำเนินงานต่อไปนี้ในการสั่งซื้อเมื่อเรียกโหลดชั้นเรียน:
ถ้าคลาสได้ถูกโหลดไปแล้วคลาสนั้นจะส่งคืน มิฉะนั้นจะมอบหมายการค้นหาคลาสใหม่ให้กับคลาสโหลดเดอร์หลัก หากโหลดคลาสพาเรนต์ไม่พบคลาสให้loadClass()
เรียกใช้เมธอดfindClass()
เพื่อค้นหาและโหลดคลาส finalClass()
ค้นหาวิธีการสำหรับการเรียนในคลาสโหลดปัจจุบันถ้าชั้นไม่ได้ถูกค้นพบโดยรถตักดินระดับผู้ปกครอง
ยังมีบทความอื่นอีกมากในบทความต้นฉบับซึ่งจะแสดงวิธีการติดตั้งคลาสเครือข่ายของคุณเองซึ่งตอบคำถามของคุณว่าทำไม (และอย่างไร) ดูเพิ่มเติมเอกสาร API