根据您的用例,我建议您查看Java ServiceLoader API。ServiceLoader API 允许您定义一个接口,并从不同的自包含 JAR 加载该接口的实现。您可以将不同的库构建到它们自己的 jar 中,通过接口公开您需要的方法,并从您的 Java 程序中独立加载它们。ServiceLoader 甚至会列出可供您使用的不同实现。
来自文档:假设我们有一个服务类型 com.example.CodecSet,它旨在表示某些协议的编码器/解码器对集。在这种情况下,它是一个具有两个抽象方法的抽象类:
public abstract Encoder getEncoder(String encodingName);
public abstract Decoder getDecoder(String encodingName);
如果提供者不支持给定的编码,每个方法都会返回一个适当的对象或 null。典型的供应商支持不止一种编码。如果 com.example.impl.StandardCodecs 是 CodecSet 服务的实现,那么它的 jar 文件还包含一个名为
META-INF/services/com.example.CodecSet
该文件包含一行:
com.example.impl.StandardCodecs # Standard codecs
CodecSet 类在初始化时创建并保存单个服务实例:
private static ServiceLoader<CodecSet> codecSetLoader
= ServiceLoader.load(CodecSet.class);
为了找到给定编码名称的编码器,它定义了一个静态工厂方法,该方法遍历已知和可用的提供程序,仅在找到合适的编码器或用完提供程序时返回。
public static Encoder getEncoder(String encodingName) {
for (CodecSet cp : codecSetLoader) {
Encoder enc = cp.getEncoder(encodingName);
if (enc != null)
return enc;
}
return null;
}
getDecoder 方法的定义类似。