Tôi tự hỏi sự khác biệt giữa Class.getResource()
và ClassLoader.getResource()
?
chỉnh sửa: Tôi đặc biệt muốn biết nếu có bất kỳ bộ nhớ đệm có liên quan đến cấp độ tập tin / thư mục. Như trong "danh sách thư mục được lưu trong bộ đệm Class?"
AFAIK sau đây về cơ bản nên làm như vậy, nhưng chúng không phải là:
getClass().getResource()
getClass().getClassLoader().getResource()
Tôi đã phát hiện ra điều này khi đấu tranh với một số mã tạo báo cáo tạo ra một tệp mới WEB-INF/classes/
từ một tệp hiện có trong thư mục đó. Khi sử dụng phương thức từ Class, tôi có thể tìm thấy các tệp đang triển khai bằng cách sử dụng getClass().getResource()
, nhưng khi cố gắng tìm nạp tệp vừa tạo, tôi đã nhận được một đối tượng null. Duyệt thư mục rõ ràng cho thấy các tập tin mới là ở đó. Tên tệp được thêm vào bằng dấu gạch chéo về phía trước như trong "/myFile.txt".
Các ClassLoader
phiên bản của getResource()
mặt khác đã tìm thấy các tập tin được tạo ra. Từ kinh nghiệm này, có vẻ như có một số loại bộ nhớ đệm của danh sách thư mục đang diễn ra. Tôi có đúng không, và nếu vậy, tài liệu này ở đâu?
Từ các tài liệu API trênClass.getResource()
Tìm một tài nguyên với một tên nhất định. Các quy tắc tìm kiếm tài nguyên được liên kết với một lớp nhất định được triển khai bởi trình nạp lớp xác định của lớp. Phương thức này ủy quyền cho trình nạp lớp của đối tượng này. Nếu đối tượng này được tải bởi trình nạp lớp bootstrap, phương thức sẽ ủy quyền cho ClassLoader.getSystemResource (java.lang.String).
Đối với tôi, điều này có nghĩa là "Class.getResource thực sự đang gọi getResource () của trình nạp lớp riêng của nó. Mà sẽ giống như làm getClass().getClassLoader().getResource()
. Nhưng rõ ràng là không. Ai đó có thể vui lòng cung cấp cho tôi một số chiếu sáng về vấn đề này?