บทความนี้ส่วนใหญ่ศึกษาเนื้อหาที่เกี่ยวข้องสำหรับการวิเคราะห์อินสแตนซ์ของตัวโหลดคลาสที่กำหนดเองในภาษา Java ดังนี้
ตัวโหลดคลาสที่ฉันเขียน
ควรสังเกตว่าหากคุณต้องการทดสอบอินสแตนซ์นี้คุณต้องสร้างไดเรกทอรี C: // MyJava บนไดรฟ์ C ก่อน จากนั้นใส่ไฟล์ Java ที่เกี่ยวข้องในไดเรกทอรีนี้ และใส่ไฟล์. clas ที่สร้างขึ้นในไดเรกทอรี c: //myjava/com/lg.test มิฉะนั้นจะไม่พบ นี่คือสิ่งที่จะให้ความสนใจ -
คลาส fileclassloader:
แพ็คเกจ com.lg.test; นำเข้า java.io.bytearrayoutputstream; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream;/*** สร้างขึ้นโดย 2016/8/6 */คลาสสาธารณะ FileClassLoader ขยาย classloader {string rootdir = null; public fileClassLoader (สตริง rootdir) {this.rootdir = rootdir;}@คลาสที่ได้รับการป้องกันการแทนที่ < คลาส <?> c = findloadedClass (className); String path = rootdir + "/" + classname.replace ('.', '/') + ".class"; ถ้า (c! = null) {return c;} elfle {/*parent delegate*/classloader loaderparent = this.getparent () {return c;} else {/*หากไม่ทำงานให้โหลดอีกครั้ง เพราะสาระสำคัญของ bytecode คืออาร์เรย์ไบต์*/inputstream คือ = null; byteArrayOutputStream outputStream = byteArrayOutputStream (); ลอง {IS = ใหม่ fileInputStream (เส้นทาง); byte [] buffer = byte ใหม่ [1024]; int len = 0; {outputStream.write (บัฟเฟอร์, 0, len);} c = defeleclass (classname, buffer, 0, buffer.length);} c = defineclass (classname, buffer, 0, buffer.length);} c (ข้อยกเว้น e) {e.printstacktrace () (ioException E) {E.PrintStackTrace ();}}}} return c;}}}}}}การสาธิตชั้นเรียน:
แพ็คเกจ com.lg.test;/*** สร้างโดยเมื่อปี 2016/8/6 *//*ตัวโหลดคลาสเดียวกันโหลดคลาสเดียวกันและ hascode เหมือนกัน ตัวโหลดคลาสที่แตกต่างกันโหลดคลาสเดียวกันและ HasCode นั้นแตกต่างกัน */การสาธิตคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {fileClassloader loader = ใหม่ fileClassLoader ("c: // myjava"); fileclassloader loader2 = fileClassloader ใหม่ ("c: // myjava"); loader.findclass ("com.lg.test.helloworld"); คลาส <?> c0 = loader.findclass ("com.lg.test.helloworld"); คลาส <?> c1 = loader2.findclass ("com.lg.test.helloworld"); c2 = loader.findclass ("com.lg.test.demo01"); class <?> c3 = loader.findclass ("com.lg.test.demo01"); class <?> c3 = loader.findclass ("java.lang.string"); system.out.println (c.hashCode ()); System.out.println (c.getClassloader ()); system.out.println (c0.hashCode ()); ระบบ. .HashCode ()); System.out.println (C1.GetClassLoader ()); System.out.println (C2.HashCode ()); System.out.println (c2.getClassloader ()); (classnotfoundexception e) {e.printstacktrace ();}}}ผลลัพธ์สุดท้ายคือ:
366712642
sun.misc.launcher$appclassloader@4e0e2f2a
366712642
sun.misc.launcher$appclassloader@4e0e2f2a
366712642
sun.misc.launcher$appclassloader@4e0e2f2a
1829164700
sun.misc.launcher$appclassloader@4e0e2f2a
2018699554
โมฆะ
หากคุณกำหนดตัวโหลดคลาสเครือข่ายคุณต้องใช้ URL นี่คือสิ่งที่จะให้ความสนใจ
คุณสามารถเปลี่ยนค่าของ rootdie เป็น com.bjsxt.cn จากนั้นใช้ url.openstream ()
ข้างต้นคือทั้งหมดที่เกี่ยวกับการวิเคราะห์อินสแตนซ์ของตัวโหลดคลาสที่กำหนดเองในภาษา Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!