ClassLoader ใน Java มีบทบาทอย่างไร



บทความนี้เป็นคำแนะนำที่ครอบคลุมเกี่ยวกับวิธีการทำงานของ ClassLoader ใน Java กล่าวถึงประเภทหลักการและวิธีการของ ClassLoader ใน Java

ในขณะที่ทำงานใน Java เรามักจะใช้คลาสจำนวนมาก คลาส Java เหล่านี้ไม่ได้โหลดทั้งหมดพร้อมกันในหน่วยความจำ แต่จะถูกโหลดเมื่อต้องการโดยแอ็พพลิเคชัน นี่คือจุดที่ Java ClassLoaders เข้ามาในรูปภาพ ดังนั้นในบทความนี้ฉันจะพูดถึงวิธีการใช้ ClassLoader ใน Java พร้อมกับตัวอย่าง

หัวข้อต่อไปนี้จะกล่าวถึงในบทความนี้:





  1. ClassLoader คืออะไร?
  2. ประเภทของ ClassLoader
  3. หลักการของ ClassLoader
  4. วิธีการของ ClassLoader
  5. ClassLoader ที่กำหนดเอง

เริ่มกันเลย!

ความคล้ายคลึงกันระหว่าง java และ javascript

ClassLoader ใน Java คืออะไร?

ClassLoader ใน Java ถูกเรียกโดย Java Runtime Environment เพื่อโหลดคลาสแบบไดนามิกเมื่อใดก็ตามที่แอปพลิเคชันต้องการใน Java Virtual Machine . เนื่องจาก ClassLoaders เป็นส่วนหนึ่งของ Java Runtime Environment Java Virtual Machine จะไม่มีความคิดใด ๆ เกี่ยวกับไฟล์และระบบไฟล์ที่เป็นพื้นฐาน



ตอนนี้ให้เราเข้าใจประเภทต่างๆของ ClassLoaders ในตัวใน Java

ประเภทของ ClassLoader ใน Java

ClassLoaders ประเภทต่างๆใน Java มีดังนี้:

ให้เราคุยกันทีละคน



ClassLoader ส่วนขยาย

ตามชื่อที่แนะนำ Extension ClassLoader โหลดส่วนขยายของคลาส Java หลักจากไฟล์ JDK ไลบรารีส่วนขยาย เป็นลูกของ Bootstrap ClassLoader และโหลดส่วนขยายจากไดเร็กทอรี JRE / lib / text หรือไดเร็กทอรีอื่น ๆ ที่ระบุในคุณสมบัติระบบ java.ext.dirs

Application หรือ System ClassLoader

Application หรือ System ClassLoader เป็นลูกของ Extension ClassLoader ClassLoader ประเภทนี้จะโหลดคลาสระดับแอ็พพลิเคชันทั้งหมดที่พบในอ็อพชันบรรทัดคำสั่ง -cp หรือ int ตัวแปรสภาวะแวดล้อม CLASSPATH

Bootstrap ClassLoader

อย่างที่เราทราบกันดีว่า คลาส Java โหลดโดยอินสแตนซ์ของ java.lang.ClassLoade แต่เนื่องจาก ClassLoaders เป็นคลาส Bootstrap ClassLoader จึงมีหน้าที่โหลดคลาสภายใน JDK BootStrap ClassLoader คือรหัสเครื่องที่เริ่มการทำงานเมื่อ JVM เรียกใช้และโหลดคลาสจาก rt.jar ดังนั้นคุณสามารถเข้าใจได้ว่า Bootstrap ClassLoader ทำหน้าที่ไม่มี ClassLoader หลักดังนั้นจึงเรียกว่า Primordial ClassLoader

บันทึก: ลำดับความสำคัญของ Bootstrap สูงกว่าส่วนขยายและลำดับความสำคัญที่กำหนดให้กับ Extension ClassLoader นั้นสูงกว่า Application ClassLoader ดูภาพด้านล่าง:

ประเภทของ ClassLoader - ClassLoader ใน Java - Edureka

ถัดไปในบทความนี้ให้เราเข้าใจหลักการทำงานของ ClassLoader

หลักการของ ClassLoader ใน Java

ชุดของกฎที่ขึ้นอยู่กับการทำงานของ Java ClassLoader เป็นหลักการสามข้อต่อไปนี้:

ให้เราเข้าใจแต่ละคน

คุณสมบัติที่เป็นเอกลักษณ์

คุณสมบัตินี้ช่วยให้มั่นใจได้ว่าไม่มีการซ้ำชั้นและคลาสทั้งหมดไม่ซ้ำกัน คุณสมบัติความเป็นเอกลักษณ์ยังทำให้แน่ใจว่าคลาสที่โหลดโดยแม่ ClassLoader ไม่ได้โหลดโดย ClassLoader ลูก ในสถานการณ์สมมติที่ ClassLoader พาเรนต์ไม่สามารถค้นหาคลาสได้อินสแตนซ์ปัจจุบันจะพยายามทำด้วยตัวเอง

รูปแบบการมอบหมาย

ClassLoader ใน Java ทำงานตามชุดของการดำเนินการที่กำหนดโดย Delegation Model ดังนั้นเมื่อใดก็ตามที่มีการสร้างคำขอเพื่อค้นหาคลาสหรือทรัพยากรอินสแตนซ์ ClassLoader จะมอบหมายการค้นหาคลาสหรือทรัพยากรให้กับ ClassLoader หลัก

ชุดของการดำเนินการตามที่ ClassLoader ทำงานมีดังนี้:

  • Java Virtual Machine ตรวจสอบว่าคลาสถูกโหลดหรือไม่เมื่อใดก็ตามที่เจอคลาส
  • ในกรณีที่โหลดคลาส JVM ดำเนินการกับคลาส แต่ในสถานการณ์ที่ไม่ได้โหลดคลาสJVM ขอให้ระบบย่อย Java ClassLoader โหลดคลาสนั้น ๆ หลังจากนั้นระบบย่อย ClassLoader จะให้การควบคุม Application ClassLoader
  • จากนั้น Application ClassLoader จะมอบหมายการร้องขอไปยัง Extension ClassLoader ซึ่งหลังจากนั้นจะส่งคำขอไปยัง Bootstrap ClassLoader
  • ตอนนี้ Bootstrap ClassLoader จะค้นหาในไฟล์Bootstrap classpath เพื่อตรวจสอบว่าคลาสนั้นพร้อมใช้งานหรือไม่ ถ้าคลาสพร้อมใช้งานคลาสจะถูกโหลดมิฉะนั้นจะส่งคำขอไปยัง Extension ClassLoader อีกครั้ง
  • Extension ClassLoader ตรวจสอบคลาสใน classpath ส่วนขยายถ้าคลาสพร้อมใช้งานแสดงว่ามีการโหลดมิฉะนั้นคำร้องขอจะถูกส่งไปยัง Application ClassLoader อีกครั้ง
  • สุดท้าย Application ClassLoader จะค้นหาคลาสใน classpath ของแอปพลิเคชันถ้าคลาสพร้อมใช้งานแล้วจะถูกโหลดมิฉะนั้นคุณจะเห็นข้อยกเว้นของ ClassNotFoundException

ดูภาพด้านล่าง

หลักการมองเห็น

ตามหลักการนี้ชั้นเรียนของเด็กจะมองเห็นได้ในชั้นเรียนที่โหลดโดย ClassLoaders หลัก แต่ในทางกลับกันก็ไม่เป็นความจริง ดังนั้นคลาสที่โหลดโดย Application ClassLoader จึงมีการมองเห็นในคลาสที่โหลดโดย Extension และ Bootstrap ClassLoader

ตัวอย่างเช่นถ้าเรามีสองคลาส: A & B สมมติว่าคลาส A โหลดโดย Application ClassLoader และคลาส B โหลดโดย Extensions ClassLoader ที่นี่คลาส A และ B จะมองเห็นได้สำหรับทุกคลาสที่โหลดโดย Application ClassLoader แต่คลาส B จะมองเห็นได้เฉพาะคลาสที่โหลดโดย Extension ClassLoader

นอกจากนี้หากคุณพยายามโหลดคลาสเหล่านี้โดยใช้ Bootstrap ClassLoader คุณจะเห็นไฟล์ java.lang.ClassNotFoundException . ข้อยกเว้น

หุ่น vs เชฟเทียบกับนักเทียบท่า

เอาล่ะเมื่อคุณทราบประเภทของ ClassLoaders และหลักการเบื้องหลังแล้วให้เรามาดูวิธีการสำคัญ ๆจาก java.lang.ClassLoader ชั้นเรียน.

วิธีการของ ClassLoader ใน Java

สิ่งสำคัญไม่กี่อย่าง ของ ClassLoader มีดังนี้:

loadClass (ชื่อสตริงการแก้ปัญหาบูลีน)

วิธีนี้เป็นจุดเริ่มต้นของ ClassLoader และใช้เพื่อโหลดคลาสที่อ้างอิงโดย JVM ใช้ชื่อของไฟล์ เป็นพารามิเตอร์ JVM เรียกใช้เมธอด loadClass () เพื่อแก้ไขการอ้างอิงคลาสโดยตั้งค่าบูลีนเป็น true เฉพาะในกรณีที่เราต้องการตรวจสอบว่ามีคลาสอยู่หรือไม่พารามิเตอร์บูลีนจะถูกตั้งค่าเป็นเท็จ

คำประกาศ:

loadClass คลาสสาธารณะ (ชื่อสตริงการแก้ปัญหาบูลีน) พ่น ClassNotFoundException {

defineClass ()

วิธีการสุดท้ายที่ใช้ในการกำหนดอาร์เรย์ของไบต์เป็นอินสแตนซ์ของคลาส ในกรณีที่คลาสไม่ถูกต้องคลาสจะพ่น ClassFormatError

คำประกาศ:

คลาสสุดท้ายที่ได้รับการป้องกัน defineClass (ชื่อสตริง, byte [] b, int off, int len) พ่น ClassFormatError

findClass (ชื่อสตริง)

เมธอด findClass ใช้เพื่อค้นหาคลาสที่ระบุ ดังนั้นจึงพบคลาสที่มีชื่อแบบเต็มเป็นพารามิเตอร์ แต่ไม่โหลดคลาส วิธี loadClass () เรียกใช้เมธอดนี้หาก ClassLoader พาเรนต์ไม่พบคลาสที่ร้องขอ นอกจากนี้หากไม่มีพาเรนต์ของ ClassLoader พบคลาสการใช้งานเริ่มต้นจะส่งไฟล์ ClassNotFoundException

คำประกาศ:

คลาสที่ได้รับการป้องกัน findClass (ชื่อสตริง) พ่น ClassNotFoundException

Class.forName (ชื่อสตริง, การเริ่มต้นบูลีน, ตัวโหลด ClassLoader)

วิธีนี้ใช้เพื่อโหลดและเริ่มต้นคลาส ให้ตัวเลือกในการเลือก ClassLoaders ใด ๆ และในกรณีที่พารามิเตอร์ ClassLoader เป็น NULL จากนั้นจะใช้ Bootstrap ClassLoader โดยอัตโนมัติ.

คำประกาศ:

สาธารณะคงคลาส forName (ชื่อสตริง, เริ่มต้นบูลีน, ตัวโหลด ClassLoader) พ่น ClassNotFoundException

getParent ()

เมธอด getParent ใช้เพื่อส่งคืน ClassLoader พาเรนต์สำหรับการมอบหมาย

คำประกาศ:

สาธารณะสุดท้าย ClassLoader getParent ()

getResource ()

ตามชื่อที่แนะนำเมธอด getResource () พยายามค้นหาทรัพยากรที่มีชื่อที่กำหนด ในขั้นต้นจะมอบหมายการร้องขอไปยัง ClassLoader หลักสำหรับทรัพยากร ในกรณีที่พาเรนต์เป็นโมฆะเส้นทางของ ClassLoader ที่สร้างไว้ใน JVM จะถูกค้นหา ตอนนี้หากล้มเหลวเมธอดจะเรียกใช้ findResource (String) เพื่อค้นหารีซอร์สโดยที่ชื่อรีซอร์สถูกระบุเป็นอินพุตที่สามารถเป็นคลาสพา ธ สัมบูรณ์หรือแบบสัมพัทธ์ จากนั้นจะส่งคืนอ็อบเจ็กต์ URL สำหรับการอ่านรีซอร์สหรือส่งคืนค่า null หากรีซอร์สไม่มีสิทธิ์เพียงพอที่จะส่งคืนรีซอร์สหรือไม่พบ

คำประกาศ:

URL สาธารณะ getResource (ชื่อสตริง)

ต่อไปในบทความเกี่ยวกับ ClassLoader ใน Java นี้ให้เราทำความเข้าใจกับ Custom ClassLoader

Custom ClassLoader ใน Java

ClassLoaders ในตัวจะดูแลกรณีส่วนใหญ่ที่ไฟล์อยู่ในระบบไฟล์อยู่แล้ว แต่ถ้าคุณต้องการโหลดคลาสออกจากฮาร์ดไดรฟ์ในเครื่องคุณต้องใช้ ClassLoaders ที่กำหนดเอง

สร้าง Custom ClassLoader

ในการสร้าง ClassLoader ที่กำหนดเองคุณต้องขยายไฟล์ ClassLoader คลาสและแทนที่ไฟล์ findClass () วิธี:

ตัวอย่าง: ให้เราสร้าง ClassLoader ที่กำหนดเองซึ่งขยาย ClassLoader เริ่มต้นและโหลดอาร์เรย์ไบต์จากไฟล์ที่ระบุ อ้างอิงจากรหัสด้านล่าง

package edureka import java.io ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class ตัวอย่างขยาย ClassLoader {@Override public Class findClass (String samplename) พ่น ClassNotFoundException {byte [] b = customLoadClassFromFile (ชื่อตัวอย่าง) ส่งคืน defineClass (ชื่อตัวอย่าง, b, 0, b.length)} ไบต์ส่วนตัว [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. SeparatorChar) + '.class') byte [] บัฟเฟอร์ ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

ด้วยเหตุนี้เราจึงสิ้นสุดบทความเกี่ยวกับ ClassLoader ใน Java นี้ ฉันหวังว่าคุณจะเข้าใจว่า ClassLoaders ใน Java คืออะไร, วิธีการ, ClassLoaders ประเภทต่างๆ ฯลฯ

หากคุณพบบทความนี้เกี่ยวกับ“ ClassLoader ใน Java” ให้ดูที่ไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก เราอยู่ที่นี่เพื่อช่วยคุณในทุกขั้นตอนในการเดินทางของคุณสำหรับการเป็นนอกเหนือจากคำถามสัมภาษณ์ java นี้เราได้จัดทำหลักสูตรที่ออกแบบมาสำหรับนักเรียนและผู้เชี่ยวชาญที่ต้องการเป็น Java นักพัฒนา

แปลง double เป็น int

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของ“ ClassLoader ใน Java ' และเราจะติดต่อกลับโดยเร็วที่สุด