2008-10-30 37 views

Trả lời

18

Không có gì được tích hợp vào Java 1.5 cho việc này. Tôi đã tự mình thực hiện nó; nó không quá phức tạp. Tuy nhiên, khi chúng tôi nâng cấp lên Java 6, tôi sẽ phải thay thế các cuộc gọi đến triển khai của mình bằng các cuộc gọi đến ServiceLoader. Tôi có thể đã xác định một cầu nối nhỏ giữa ứng dụng và trình tải, nhưng tôi chỉ sử dụng nó ở một vài nơi và bản thân trình bao bọc sẽ là một ứng cử viên tốt cho ServiceLoader.

Đây là ý tưởng cốt lõi:

public <S> Iterable<S> load(Class<S> ifc) throws Exception { 
    ClassLoader ldr = Thread.currentThread().getContextClassLoader(); 
    Enumeration<URL> e = ldr.getResources("META-INF/services/" + ifc.getName()); 
    Collection<S> services = new ArrayList<S>(); 
    while (e.hasMoreElements()) { 
    URL url = e.nextElement(); 
    InputStream is = url.openStream(); 
    try { 
     BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
     while (true) { 
     String line = r.readLine(); 
     if (line == null) 
      break; 
     int comment = line.indexOf('#'); 
     if (comment >= 0) 
      line = line.substring(0, comment); 
     String name = line.trim(); 
     if (name.length() == 0) 
      continue; 
     Class<?> clz = Class.forName(name, true, ldr); 
     Class<? extends S> impl = clz.asSubclass(ifc); 
     Constructor<? extends S> ctor = impl.getConstructor(); 
     S svc = ctor.newInstance(); 
     services.add(svc); 
     } 
    } 
    finally { 
     is.close(); 
    } 
    } 
    return services; 
} 

Better xử lý ngoại lệ là trái như một bài tập cho người đọc. Ngoài ra, phương pháp có thể được tham số hóa để chấp nhận một ClassLoader của người gọi lựa chọn.

0

Không có cách nào đáng tin cậy để biết lớp nào nằm trong đường dẫn lớp. Theo số documentation, ServiceLoader dựa vào các tệp bên ngoài để cho biết các lớp cần tải; bạn có thể muốn làm như vậy. Ý tưởng cơ bản là để có một tập tin với tên của các lớp (es) để tải, và sau đó sử dụng phản ánh để nhanh chóng nó/chúng.

1

ServiceLoader là khá cơ bản và đã được sử dụng (không chính thức) trong JDK từ 1.3. ServiceLoader cuối cùng đã biến nó trở thành công dân hạng nhất. Nó đơn giản tìm kiếm một tệp tài nguyên có tên cho giao diện của bạn, mà về cơ bản được gói trong thư mục META-INF của một thư viện jar.

Tệp đó chứa tên của lớp cần tải.

Vì vậy, bạn muốn có một file có tên:

META-INF/dịch vụ/com.example.your.interface

và bên trong nó là một dòng duy nhất: com.you.your.interfaceImpl .

Thay cho ServiceLoader, tôi thích Tra cứu Netbeans. Nó hoạt động với 1,5 (và có thể 1,4).

Hết hộp, nó cũng giống như ServiceLoader và nó tầm thường để sử dụng. Nhưng nó cung cấp tính linh hoạt hơn rất nhiều.

Dưới đây là một liên kết: http://openide.netbeans.org/lookup/

Dưới đây là một bài viết về ServiceLoader, nhưng nó đề cập đến Netbeans Lookup ở phía dưới: http://weblogs.java.net/blog/timboudreau/archive/2008/08/simple_dependen.html

-1

Bạn đã nghĩ đến việc sử dụng một khuôn khổ OSGi?

5

javax.imageio.spi.ServiceRegistry tương đương với các phiên bản Java trước. Nó có sẵn từ Java 1.4.

Nó không giống như một lớp tiện ích chung, nhưng nó được. Nó thậm chí còn mạnh hơn một chút so với ServiceLoader, vì nó cho phép kiểm soát một số thứ tự của các nhà cung cấp được trả về và truy cập trực tiếp vào sổ đăng ký.

Xem http://docs.oracle.com/javase/7/docs/api/index.html?javax/imageio/spi/ServiceRegistry.html

1

Thật không may,

Không có gì được xây dựng vào Java 1.5 cho điều này là ...

chỉ là một phần của sự thật.

Không có tiêu chuẩn sun.misc.Service xung quanh.

http://www.docjar.com/docs/api/sun/misc/Service.html

Hãy coi chừng, nó không phải là một phần của API J2SE tiêu chuẩn! Đây là phần không chuẩn của Sun JDK. Vì vậy, bạn không thể dựa vào nó nếu bạn sử dụng, giả sử, JRockit.

1

Đây là câu hỏi cũ nhưng tùy chọn khác là sử dụng Chú thích cấp gói. Xem câu trả lời của tôi cho: Find Java classes implementing an interface

Chú thích cấp gói là chú thích nằm trong lớp package-info.java.

JAXB sử dụng tùy chọn này thay vì Trình tải dịch vụ. Tôi cũng nghĩ rằng nó linh hoạt hơn so với bộ tải dịch vụ.

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