Gần đây tôi đã tìm cách tải động tệp jar vào ứng dụng của tôi khi chạy.Nguy hiểm khi sử dụng sự phản chiếu để thêm tệp vào đường dẫn lớp vào thời gian chạy
Tôi đã đi cùng một giải pháp nhất định vài lần, về cơ bản là "hack" có trình nạp lớp hệ thống và sử dụng phản chiếu để truy cập phương thức addURL khác được thêm vào để thêm tệp bổ sung vào classpath ban đầu khi chạy. Giải pháp này giả sử hoạt động thực sự tốt và tránh được các vấn đề xảy ra khi viết và sử dụng trình nạp lớp tùy chỉnh selfmade.
Nó trông giống như sau:
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
Câu hỏi của tôi là như sau: Tôi giả sử có một lý do thực sự tốt cho việc thực hiện phương pháp addURL bảo vệ ở nơi đầu tiên, thì phải có một số loại cạm bẫy hay nguy hiểm khi thêm tệp vào classpath động.
Bên cạnh việc giả định trình nạp lớp hệ thống luôn là URLClassLoader, "luôn luôn là trường hợp" (TM), tôi có thể gặp phải sự cố nào khi sử dụng "hack" này?
Cảm ơn
Tại sao bạn muốn thay đổi hệ thống * * classloader thay vì tạo một trường hợp classloader mới mà biết về các tập tin jar thêm? –
tôi không hoàn toàn chắc chắn phải trung thực. Tôi rất mới với khái niệm về trình nạp lớp nói chung, vì vậy vẫn còn rất nhiều về chúng mà tôi không hiểu đầy đủ. tôi đọc ở đâu đó ở đây trên stackoverflow mà sử dụng một trình nạp lớp tùy chỉnh có thể gây ra vấn đề trong một số trường hợp, ví dụ nếu tôi sử dụng nó để tải một thư viện đã được tải thông qua classpath mặc định khi khởi động chương trình. "hack" này ở trên, mặc dù nó khá khó chịu, được coi là phương pháp duy nhất tải bình khi chạy mà không có nguy cơ gặp phải sự cố phụ thuộc/không tương thích. – thousands
Bạn cũng * đang thử * để tải các thư viện đã có trong classpath mặc định? Điều này nghe có vẻ nguy hiểm hơn nhiều so với cách tiếp cận * được thiết kế * của các trình nạp lớp riêng biệt. –