classloader มีสองวิธีในการรับทรัพยากรจาก classpath ที่โหลด:
URL สาธารณะ getResource (ชื่อสตริง); Public InputStream GetResourceasstream (ชื่อสตริง);
ชื่อที่นี่คือ ClassPath ของทรัพยากรซึ่งสัมพันธ์กับเส้นทางรูท "/" GetResource ได้รับวัตถุ URL เพื่อค้นหาทรัพยากรและ GetResourceasstream ได้รับการอ้างอิงถึงสตรีมอินพุตทรัพยากรเพื่อให้แน่ใจว่าโปรแกรมสามารถดึงข้อมูลจากตำแหน่งที่ถูกต้อง
แต่สิ่งที่เราใช้จริง ๆ ไม่ใช่วิธีการเรียนรู้ แต่วิธีการ getResource และ getResourceasstream ของคลาสเนื่องจากวัตถุคลาสสามารถรับได้จากชั้นเรียนของคุณ (เช่นคุณคลาสของคุณหรือคลาสของคุณ อย่างไรก็ตามตามเอกสาร JDK วิธีการทั้งสองของวัตถุคลาสนี้จริง ๆ แล้ว "มอบหมาย" ให้กับคลาสโหลดที่โหลดดังนั้นคุณจะต้องใช้สองวิธีนี้ของวัตถุคลาส
ดังนั้นเรียกสิ่งนี้โดยตรง getClass (). getResourceasstream (ชื่อสตริง) เพื่อรับสตรีมและใช้ classloader.getSystemResourceasstream (ชื่อสตริง) ในวิธีการคงที่
ต่อไปนี้เป็นวิธีที่จะได้รับ classpath และเส้นทางที่แน่นอนไปยังคลาสปัจจุบัน คุณอาจต้องใช้วิธีการเหล่านี้เพื่อให้ได้เส้นทางที่สมบูรณ์ไปยังทรัพยากรที่คุณต้องการ
1. This.getClass (). getResource ("")
สิ่งที่คุณได้รับคือไดเรกทอรี URI ของไฟล์คลาสปัจจุบัน ไม่รวมตัวเอง!
ตัวอย่างเช่น: ไฟล์:/d:/workspace/jbpmtest3/bin/com/test/
2. This.getClass (). getResource ("/")
สิ่งที่คุณได้รับคือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ตัวอย่างเช่น: ไฟล์:/d:/workspace/jbpmtest3/bin/
3. This.getClass () .getClassLoader (). getResource ("")
สิ่งที่คุณได้รับก็คือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ตัวอย่างเช่น: ไฟล์:/d:/workspace/jbpmtest3/bin/
4.classloader.getSystemResource ("")
สิ่งที่คุณได้รับก็คือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ตัวอย่างเช่น: ไฟล์:/d:/workspace/jbpmtest3/bin/
5.Thread.currentThread (). getContextClassLoader (). getResource ("")
สิ่งที่คุณได้รับก็คือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ตัวอย่างเช่น: ไฟล์:/d:/workspace/jbpmtest3/bin/
6.ServleTactionContext.getServletContext (). getRealPath ("/")
ในเว็บแอปพลิเคชันรับเส้นทางที่แน่นอนไปยังไดเรกทอรีรูทของเว็บแอปพลิเคชัน ด้วยวิธีนี้เราจำเป็นต้องจัดเตรียมเส้นทางที่สัมพันธ์กับไดเรกทอรีรากของเว็บแอปพลิเคชันเพื่อสร้างเส้นทางที่แน่นอนเพื่อค้นหาทรัพยากร
ตัวอย่างเช่น: ไฟล์: /d:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webproject
บันทึก:
1. พยายามอย่าใช้เส้นทางสัมพัทธ์ที่สัมพันธ์กับ System.getProperty ("user.dir") ไดเรกทอรีผู้ใช้ปัจจุบัน นี่คือระเบิดเวลาที่อาจฆ่าคุณได้ตลอดเวลา
2. พยายามใช้ทรัพยากรเส้นทางที่สมบูรณ์ในรูปแบบของ URI สามารถแปลงเป็น URI, URL, วัตถุไฟล์ได้อย่างง่ายดาย
3. พยายามใช้ classpaths สัมพัทธ์ อย่าใช้เส้นทางสัมบูรณ์ การใช้ URL แบบคงที่ GetExtendResource (String Retinative) วิธีการของคลาส classloaderUtil ด้านบนคุณสามารถค้นหาทรัพยากรได้ในทุกสถานที่โดยใช้เส้นทางสัมพัทธ์ที่สัมพันธ์กับ ClassPath
4. อย่าใช้เส้นทางสัมบูรณ์ที่มีรหัสแข็งอย่างแน่นอน เพราะเราสามารถใช้วิธีการ getResource ("") ของคลาส classloader เพื่อรับเส้นทางสัมบูรณ์ของ classpath ปัจจุบัน หากคุณต้องระบุเส้นทางที่แน่นอนการใช้ไฟล์การกำหนดค่านั้นดีกว่ายากมาก!
วิธีรับเส้นทางนอก ClassPath:
url base = this.getClass (). getResource (""); // ก่อนได้รับตำแหน่งของคลาสนี้เช่น/home/popeye/testjava/build/classes/net/
String Path = ไฟล์ใหม่ (base.getFile (), "…/…/…/…/”+ชื่อ) .getCanonicalPath (); // คุณสามารถรับ/home/popeye/testjava/ชื่อ
นอกจากนี้หากคุณเริ่มโปรแกรมจาก ANT การดึงมาจาก this.getClass () GetResource ("" ค่อนข้างแปลกและคุณสามารถดีบั๊กได้สำเร็จด้วยบรรทัดคำสั่ง Java
มาดูวิธีการที่จะได้รับ classpath classpath ใน Java
ฉันพูดมากขึ้นดังนั้นฉันจะโพสต์รหัสคีย์ให้คุณโดยตรง รหัสเฉพาะมีดังนี้:
<span style = "font-size: 18px;"> system.out.println ("++++++++++++++++++++++++++++++++++++++++ freemarkerWriter.class.getProtectionDomain (). getCodeSource (). getLocation (). getPath (); String path3 = freemarkerWriter.class.getProtectionDomain (). getCodeSource (). getLocation () thread.currentthread (). getContextclassloader (). getResource (""). getPath (); system.out.println ("เส้นทาง 1 =" + พา ธ ); system.out.println ("เส้นทาง 2 =" + path2); path4); system.out.println ("+++++++++++++++++++++++++++++++++++++++++; </span>ข้างต้นเป็นรหัสง่าย ๆ ของวิธีการที่จะได้รับ classpath classpath ใน Java แนะนำให้คุณรู้จักโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉัน บรรณาธิการจะตอบกลับคุณทันเวลา!