Đối với ví dụ mã trong câu hỏi, giải pháp chuẩn là tham chiếu lớp rõ ràng bằng tên của nó và thậm chí có thể thực hiện mà không cần getClassLoader()
gọi:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Cách tiếp cận này vẫn có một mặt trái là nó không an toàn trước các lỗi sao chép / dán trong trường hợp bạn cần sao chép mã này sang một số lớp tương tự.
Và đối với câu hỏi chính xác trong tiêu đề, có một mẹo được đăng trong chuỗi liền kề :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Nó sử dụng một Object
lớp con ẩn danh lồng nhau để nắm giữ bối cảnh thực thi. Thủ thuật này có lợi ích là sao chép / dán an toàn ...
Thận trọng khi sử dụng điều này trong Lớp cơ sở mà các lớp khác kế thừa từ:
Cũng cần lưu ý rằng nếu đoạn mã này được định hình là một phương thức tĩnh của một số lớp cơ sở thì currentClass
giá trị sẽ luôn là một tham chiếu đến lớp cơ sở đó thay vì bất kỳ lớp con nào có thể đang sử dụng phương thức đó.
getResource()
trước khi có một thể hiện của lớp do người dùng định nghĩa (ví dụ: không phải J2SE) đôi khi sẽ thất bại. Vấn đề là JRE sẽ sử dụng trình nạp lớp bootstrap ở giai đoạn đó, sẽ không có tài nguyên ứng dụng trên đường dẫn lớp (của trình tải bootstrap).