我将尝试确定在运行时基于类路径上可用的类创建一个新类实例的最佳方法。
例如,我有一个库需要解析多个类中的JSON响应。该库具有以下接口:
JsonParser.java:
我想做的是动态地获取类路径上哪个库,并创建正确的实例,这样库的用户就不必考虑它(甚至不必知道另一个类解析JSON的内部实现)。
我考虑类似以下内容:
例如,我有一个库需要解析多个类中的JSON响应。该库具有以下接口:
JsonParser.java:
public interface JsonParser {
<T> T fromJson(String json, Class<T> type);
<T> String toJson(T object);
}
这个类有多个实现,例如GsonJsonParser
、JacksonJsonParser
、Jackson2JsonParser
,目前,库的用户需要根据他们在项目中包含的库来“选择”要使用的实现。例如:
JsonParser parser = new GsonJsonParser();
SomeService service = new SomeService(parser);
我想做的是动态地获取类路径上哪个库,并创建正确的实例,这样库的用户就不必考虑它(甚至不必知道另一个类解析JSON的内部实现)。
我考虑类似以下内容:
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");
这是否是一个合适的解决方案?它似乎有些像黑客,同时使用异常来控制流程。
有更好的方法吗?