Tôi đang cố tải một tệp .class java động và gọi nó bằng cách phản chiếu.Việc tải lớp Java chạy cực kỳ chậm?
Tôi có một lớp được gọi là Foo; nó có một hàm tạo rỗng và có một phương thức được gọi là doit() nhận một đối số String và trả về một String. Ngoài ra nó đảo ngược chuỗi.
Đây là mã của tôi:
URL url = new URL("file://C:/jtest/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> cl = loader.loadClass("Foo");
Constructor<?> cons = cl.getConstructor((Class[])null);
Object ins = cons.newInstance(new Object[]{});
Method meth = cl.getDeclaredMethod("doit", String.class);
Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
System.out.println((String)ret);
Đúng như dự đoán in này "Hello World!". Tuy nhiên, phải mất khoảng 30 giây để hoàn tất. Tôi biết sự phản chiếu chậm, nhưng tôi mong đợi nó là 10 ms hoặc một cái gì đó.
Tôi đang sử dụng Eclipse với JRE 1.6.0_13 và tôi đang chạy Windows Vista.
Tôi đang làm gì sai ở đây?
Cảm ơn.
Chỉnh sửa: Tôi đã lược tả mã và tất cả thời gian của nó được sử dụng trong dòng thứ ba (loadClass()). Mọi thứ khác xảy ra ngay lập tức.
Chỉnh sửa: Tôi đã đặt mã trong vòng lặp; các chức năng chậm bằng cách nào đó được tối ưu hóa và mất 30 giây chỉ trên vòng đầu tiên.
Chỉnh sửa: Tôi đã tìm thấy giải pháp.
Thay vì:
URL url = new URL("file://C:/jtest/");
tôi đã thay đổi nó để:
URL url = new URL("file:/C:/jtest/");
Bây giờ nó hoạt động hoàn hảo. Tôi không biết tại sao nó hoạt động, nhưng tôi không thấy làm thế nào tôi (và 5 người khác) có thể đã bỏ lỡ điều đó. Bây giờ tôi cảm thấy câm ..
loadClass trước tiên kiểm tra bộ nhớ cache để xem liệu lớp đã được tải chưa, nếu tôi nhớ chính xác. Điều đó sẽ giải thích tại sao nó không mất nhiều thời gian trong lần lặp thứ hai. –
Là "Foo" thực sự trong một gói? Tải từ gói mặc định (không có gói) có thể có hiệu ứng lạ. Hãy thử chuyển sang foo.Foo. – flicken
Thật thú vị ... URL mới ("tệp:/C:/jtest /"). GetPath() là/C:/jtest /. Tôi tự hỏi làm thế nào URLClassLoader diễn giải điều đó. –