2012-04-24 39 views
20

Tôi cố gắng để sử dụng Java ServiceLoader để tìm tất cả các lớp học mà thực hiện một giao diện cụ thể như sau:ServiceLoader để tìm hiện thực của một giao diện

loader = ServiceLoader.load(Operation.class); 
try { 
    for (Operation o : loader) { 
     operations.add(o); 
    } 
} catch (ServiceConfigurationError e) { 
    LOGGER.log(Level.SEVERE, "Uncaught exception", e); 
} 

Thật không may, khi tôi chạy Eclipse trong chế độ gỡ lỗi các ServiceLoader không tìm bất kỳ lớp học nào. Tôi cảm thấy như tôi đang thiếu một điểm tầm thường ...

+6

Bạn đã cấu hình 'META-INF/services/fqcn.Operation' chưa? – nobeh

Trả lời

25

ServiceLoader không thể làm điều đó.

Để hiển thị lớp học dưới dạng dịch vụ có thể được phát hiện bởi ServiceLoader, bạn cần đặt tên của nó vào tệp cấu hình của nhà cung cấp, như được mô tả trong Creating Extensible Applications With the Java Platform .

Không có cách tích hợp nào tìm tất cả các lớp triển khai giao diện cụ thể. Các khung làm việc tương tự có thể sử dụng các giải pháp quét classpath của riêng họ (và thậm chí với quét classpath tùy chỉnh nó không dễ dàng vì các tệp .class chỉ lưu trữ thông tin về các giao diện được triển khai trực tiếp, không quá tải).

18

Nếu việc triển khai là những gì mà bạn đã viết cho mình, bạn có thể sử dụng AutoService để làm cho họ có sẵn thông qua giao diện ServiceLoader, ví dụ:

@AutoService(Operation.class) 
class Foo implements FooInterface { 

} 

@AutoService(Operation.class) 
class Bar extends Foo { 

} 
+2

Cảm ơn bạn rất nhiều vì gợi ý này! Tôi không thể tải tệp nhà cung cấp để hoạt động. Phải đặt nó vào chỗ sai hoặc với một lỗi đánh máy hay cái gì đó, nhưng điều này đã làm việc ngay từ cái hộp với con quạ. Bạn có thể tìm phiên bản mới nhất trong kho lưu trữ maven tại http://mvnrepository.com/artifact/com.google.auto.service/auto-service –

+0

Niềm vui của tôi! Nếu bạn có những cải tiến, vui lòng chỉnh sửa câu trả lời cho người xem từ tương lai (trong tương lai) – Xiao

+0

Dịch vụ AutoService này thật tuyệt vời! – Frankie

0

Để quét classpath của bạn trong thời gian chạy cho triển khai các giao diện cụ thể mà bạn sẽ cần phải sử dụng giải pháp khác nhau ví dụ. Reflections (thông báo s khi kết thúc, đây không phải là API phản ánh của java)

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