สำหรับตัวอย่างรหัสในคำถามโซลูชันมาตรฐานคือการอ้างอิงคลาสอย่างชัดเจนโดยใช้ชื่อและสามารถทำได้โดยไม่ต้องgetClassLoader()
โทร:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
วิธีการนี้ยังคงมีด้านหลังที่ไม่ปลอดภัยต่อข้อผิดพลาดในการคัดลอก / วางในกรณีที่คุณต้องการทำซ้ำรหัสนี้เป็นจำนวนคลาสที่คล้ายกัน
และสำหรับคำถามที่แน่นอนในพาดหัวมีเคล็ดลับโพสต์ในหัวข้อที่อยู่ติดกัน :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
มันใช้Object
คลาสย่อยที่ไม่ระบุชื่อซ้อนเพื่อรับบริบทการดำเนินการ เคล็ดลับนี้มีประโยชน์ในการคัดลอก / วางอย่างปลอดภัย ...
ข้อควรระวังเมื่อใช้สิ่งนี้ในคลาสฐานที่คลาสอื่นสืบทอดมาจาก:
นอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าส่วนย่อยนี้มีรูปร่างเป็นวิธีคงที่ของคลาสฐานบางcurrentClass
ค่าจะอ้างอิงถึงคลาสฐานนั้นแทนคลาสย่อยใด ๆ ที่อาจใช้เมธอดนั้นเสมอ
getResource()
ก่อนมีอินสแตนซ์ของคลาสที่ผู้ใช้กำหนด (เช่นที่ไม่ใช่ J2SE) บางครั้งจะล้มเหลว ปัญหาคือ JRE จะใช้ bootstrap class-loader ในระยะนั้นซึ่งจะไม่มีทรัพยากรแอปพลิเคชันบน class-path (ของ bootstrap loader)