Tôi đang cố gắng xác định cách tốt nhất để tạo một cá thể mới của một lớp dựa trên các lớp nào có sẵn trên classpath khi chạy.Tạo triển khai lớp Java động dựa trên các phụ thuộc được cung cấp trong thời gian chạy
Ví dụ: tôi có thư viện yêu cầu phản hồi JSON phải được phân tích cú pháp trong nhiều lớp. Thư viện có giao diện như sau:
JsonParser.java
:
public interface JsonParser {
<T> T fromJson(String json, Class<T> type);
<T> String toJson(T object);
}
Lớp này có nhiều hiện thực, tức là GsonJsonParser
, JacksonJsonParser
, Jackson2JsonParser
, và hiện nay, người sử dụng của thư viện là cần thiết để "nhặt" thực hiện của họ để được sử dụng dựa trên thư viện nào họ đã đưa vào dự án của họ. Ví dụ:
JsonParser parser = new GsonJsonParser();
SomeService service = new SomeService(parser);
Điều tôi muốn làm là tự động nhận thư viện nào trên đường dẫn lớp và tạo cá thể thích hợp để người dùng thư viện không phải nghĩ về nó (hoặc thậm chí phải biết việc thực thi nội bộ của một lớp phân tích cú pháp JSON).
tôi đang xem xét một cái gì đó tương tự như sau:
try {
Class.forName("com.google.gson.Gson");
return new GsonJsonParser();
} catch (ClassNotFoundException e) {
// Gson isn't on classpath, try next implementation
}
try {
Class.forName("com.fasterxml.jackson.databind.ObjectMapper");
return new Jackson2JsonParser();
} catch (ClassNotFoundException e) {
// Jackson 2 was not found, try next implementation
}
// repeated for all implementations
throw new IllegalStateException("You must include either Gson or Jackson on your classpath to utilize this library");
này sẽ là một giải pháp thích hợp? Nó có vẻ giống như một hack, cũng như sử dụng các ngoại lệ để kiểm soát dòng chảy.
Có cách nào tốt hơn để thực hiện việc này không?
Tôi đồng ý, đó là * hack *. Chọn một phụ thuộc trình phân tích cú pháp JSON và sử dụng nó? Cách tiếp cận của bạn cũng * có thể * trở nên bất ngờ ** không xác định **; tùy thuộc vào các JAR (và có thể thứ tự của các JAR trong đường dẫn lớp) hành vi của chương trình có thể thay đổi. –
@ElliottFrisch Tôi muốn làm điều đó, nhưng hiện tại các ứng dụng sẽ sử dụng nó có bất kỳ một trong những trình phân tích cú pháp đó, và tôi đang cố gắng tránh việc thứ hai trở thành phụ thuộc nếu nó khác với thứ tôi quyết định để gói (hoặc cùng một thư viện, phiên bản khác nhau). – Casey
@ElliottFrisch Dường như nó không phải là hack như vậy, xem câu trả lời của tôi, nơi tôi đã cung cấp liên kết đến việc thực hiện cùng một mùa xuân của cùng một vấn đề. – Andremoniy