2012-02-08 48 views
5

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?

+1

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

+0

Đó 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! :) –

+0

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

Trả lời

3

Có; triển khai giao diện (hoặc sử dụng chú thích).

Sau đó sử dụng bất kỳ thư viện quét lớp nào (có rất nhiều câu hỏi SO về điều này, như this one) để tải lớp cụ thể được đề cập. Tìm kiếm "Quét lớp Java" hoặc "cơ chế trình cắm Java" sẽ giúp ích.

Bạn cũng có thể chỉ muốn sử dụng số Java Plugin Framework và tránh một số nỗ lực. Mặc dù nó không rõ ràng với tôi rằng nó được duy trì nữa, tôi biết mọi người vẫn đang sử dụng nó.

+0

Tôi không nghĩ giao diện sẽ hoạt động chính xác (ngữ nghĩa) trong trường hợp của tôi. 'AbstractClass' có nhiều hàm được xác định trước chỉ sử dụng các phương thức ghi đè (thụ động ghi đè, wtf?) Của việc triển khai. Giao diện không cho phép điều đó. –

+0

@ FlorianPeschka ... cùng một sự khác biệt. –

+0

Tôi không hiểu nhận xét của bạn. Sự khác biệt của cái gì? –

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