Tôi có một ứng dụng cho phép, sử dụng một lớp trừu tượng, mọi người viết các triển khai của riêng họ. Tôi tải những triển khai này dưới dạng .class-files từ một thư mục. Hiện tại, tôi có giải pháp này:Tải các lớp học từ thư mục mà không chỉ định gói
File classDir = new File("https://stackoverflow.com/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Như bạn thấy - tôi cần chỉ định gói các lớp được đặt để tải chúng một cách chính xác. Bỏ qua gói, tôi nhận được một số báo lỗi
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
.
Bây giờ, từ một POV kiến trúc, tôi nghĩ rằng nó rất kém thiết kế mà các lớp người khác thiết kế phải được biên dịch vào gói MY khi tải chúng.
Vì vậy, tôi hỏi bạn: Có cách nào tôi có thể tải các lớp học tạo thành hệ thống tệp mà không phải chỉ định gói họ cư trú không?
Bạn có thể giữ cấu trúc gói dưới dạng cấu trúc thư mục trong đường dẫn của mình? Và tạo tên gói từ đường dẫn trước khi tải lớp học? –
Đó sẽ là một khả năng ... Ít nhất thì tôi sẽ không phải gặp rắc rối khi hai lớp học có cùng tên ... suy nghĩ tốt đẹp từ góc độ khác! :) –
Hãy thử nó và xem nếu nó hoạt động, nếu bạn muốn một số ví dụ mã cho tôi biết! –