2012-10-27 24 views
6

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

+4

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? –

+0

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

+1

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. –

Trả lời

1

Nguy hiểm chính là dựa vào kiểm tra thời gian chạy của phương pháp tồn tại.

Nếu chữ ký của phương thức thay đổi trong tương lai, bạn sẽ không biết về nó cho đến khi chạy. Điều này cũng có thể để lại trong một tình huống khó chịu nếu không có phương pháp thay thế được cung cấp.

Ngoài ra, như khổng lồ đã khẳng định, các nhà thiết kế chọn để thực hiện các phương pháp protected vì một lý do (khác sau đó thiếu suy tính trước)

Các vấn đề liên quan