แนะนำรายละเอียดเกี่ยวกับกระบวนการโหลดคลาส Java ขั้นพื้นฐาน
กระบวนการพื้นฐาน:
- โหลดสตรีมไบนารีไบต์ที่กำหนดคลาสตามชื่อที่ผ่านการรับรองของคลาส
- แปลงโครงสร้างการจัดเก็บข้อมูลคงที่ที่แสดงโดยสตรีมไบต์เป็นโครงสร้างข้อมูลรันไทม์ของพื้นที่เมธอด
- สร้างวัตถุ java.lang.class ที่แสดงคลาสนี้ในหน่วยความจำและใช้เป็นวิธีการเข้าถึงพอร์ทัลการเข้าถึงข้อมูลต่างๆของคลาสนี้
คลาสอาร์เรย์ไม่ได้ถูกสร้างขึ้นผ่านตัวโหลดคลาส แต่ถูกสร้างขึ้นโดยตรงโดยเครื่องเสมือน Java และประเภทองค์ประกอบของคลาสอาร์เรย์ถูกโหลดโดยตัวโหลดคลาส
ประเภทองค์ประกอบของคลาสอาร์เรย์: ประเภทของอาร์เรย์หลังจากลบมิติทั้งหมด
การตรวจสอบรูปแบบไฟล์:
- 0xCafebaby เริ่มต้นด้วยหมายเลขเวทย์มนตร์
- เครื่องเสมือนปัจจุบันสามารถจัดการหมายเลขเวอร์ชันหลักและรอง
- ประเภทคงที่;
- ประเภทการดำเนินการดัชนี;
- ชนิดข้อมูลที่เข้ารหัส UTF8
การตรวจสอบข้อมูลเมตา: การวิเคราะห์ความหมายของไบต์คำอธิบายข้อมูล:
- ไม่ว่าจะมีคลาสหลักหรือไม่
- ไม่ว่าจะเป็นคลาสหลักจะสืบทอดคลาสที่แก้ไขแล้วหรือไม่
- ไม่ว่าจะเป็นคลาสที่ไม่ได้เปิดเผยใช้วิธีการที่จำเป็นต้องใช้ในคลาสหลักหรืออินเทอร์เฟซ
- เขียนทับฟิลด์และวิธีการในชั้นเรียนความขัดแย้งมากเกินไป
การตรวจสอบ Bytecode: กำหนดความถูกต้องตามกฎหมายและความถูกต้องของโปรแกรมผ่านการวิเคราะห์การไหลของความหมายและการควบคุมการไหลและการตรวจสอบการวิเคราะห์ร่างกาย
- การตรวจสอบการอ้างอิงสัญลักษณ์: เมื่อเครื่องเสมือนแปลงการอ้างอิงสัญลักษณ์เป็นข้อมูลอ้างอิงโดยตรงในขั้นตอนการแยกวิเคราะห์มันจะทำการตรวจสอบการจับคู่ข้อมูลนอกชั้นเรียน
- ไม่ว่าจะเป็นคลาสที่สอดคล้องกันโดยชื่อที่ผ่านการรับรองอย่างสมบูรณ์ซึ่งอธิบายโดยอักขระในการอ้างอิงเชิงสัญลักษณ์หรือไม่
- ระบุว่ามีตัวอธิบายในคลาสที่ตรงกับฟิลด์วิธีการเช่นเดียวกับวิธีการและฟิลด์ที่อธิบายโดยชื่อง่าย ๆ หรือไม่
- การเข้าถึงคลาสฟิลด์และวิธีการในการอ้างอิงเชิงสัญลักษณ์
การเตรียมการ: จัดสรรหน่วยความจำสำหรับตัวแปรคลาสในพื้นที่เมธอดและตั้งค่าเริ่มต้นของตัวแปรคลาส
- ค่าเริ่มต้นมักจะเป็นค่าศูนย์ของชนิดข้อมูลและค่าที่แก้ไขสุดท้ายจะเริ่มต้นโดยตรงกับค่าที่สอดคล้องกัน
- ตัวแปรคลาสเป็นตัวแปรดัดแปลงแบบคงที่ซึ่งแตกต่างจากตัวแปรอินสแตนซ์
การวิเคราะห์: เครื่องเสมือนแทนที่การอ้างอิงเชิงสัญลักษณ์ในพูลคงที่ด้วยกระบวนการอ้างอิงโดยตรง
constant_class_info, constant_fieldref_info, constant_methodref_info ..
- การอ้างอิงสัญลักษณ์: ชุดของสัญลักษณ์อธิบายเป้าหมายที่อ้างอิง รูปแบบใด ๆ ของตัวอักษรสามารถใช้เพื่อค้นหาเป้าหมายโดยไม่มีความคลุมเครือ มันไม่มีส่วนเกี่ยวข้องกับการใช้งานหน่วยความจำเสมือนจริงและไม่ว่าจะโหลดเป้าหมายอ้างอิงหรือไม่
- การอ้างอิงโดยตรง: ตัวชี้โดยตรงไปยังเป้าหมายออฟเซ็ตหรือที่จับที่อยู่ทางอ้อมกับเป้าหมายนั้นเกี่ยวข้องกับหน่วยความจำที่ใช้โดยเครื่องเสมือน ต้องโหลดวัตถุเป้าหมายที่เกี่ยวข้องโดยตรงอ้างอิง
- - - -
การเริ่มต้น: เริ่มดำเนินการรหัสโปรแกรม Java ในนิยามคลาส ดำเนินการคลาส Constructor <cinit> ()
<cinit> ():
- คอมไพเลอร์จะรวบรวมการกระทำที่ได้รับมอบหมายของตัวแปรคลาสโดยอัตโนมัติในคลาสตามลำดับคำจำกัดความในไฟล์คลาสและรวมคำสั่งของบล็อกคำสั่งแบบคงที่ บล็อกคำสั่งแบบคงที่สามารถเข้าถึงตัวแปรที่กำหนดไว้ก่อนหน้านี้เท่านั้น
- แตกต่างจากตัวสร้างคลาสตัวสร้างคลาสแม่ไม่จำเป็นต้องเรียกตามที่แสดง เครื่องเสมือนช่วยให้มั่นใจได้ว่าคลาสแม่ <cinit> () ได้ถูกดำเนินการก่อนที่จะดำเนินการคลาสย่อย
- บล็อกคำสั่งแบบคงที่ในคลาสพาเรนต์จะดำเนินการก่อน
- <cinit> () ไม่จำเป็นสำหรับคลาสหรืออินเทอร์เฟซและจะไม่ถูกสร้างขึ้นหากไม่มีการทำงานที่กำหนดตัวแปรหรือบล็อกคำสั่งคงที่
- <cinit> () ของอินเทอร์เฟซไม่จำเป็นต้องดำเนินการ <cinit> () ของอินเทอร์เฟซหลักก่อนและไม่จำเป็นต้องใช้คลาสการใช้งานอินเตอร์เฟสเดียวกัน <cinit> ()
- ความปลอดภัยของเธรด: เครื่องเสมือนช่วยให้มั่นใจได้ว่า <cinit> () ถูกล็อคและซิงโครไนซ์อย่างถูกต้องในสภาพแวดล้อมแบบมัลติเธรด มีเพียงหนึ่งเธรดเท่านั้นที่สามารถเข้าถึง <cinit> () ของคลาสการเริ่มต้นในเวลาเดียวกัน
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!