您可以使用对服务提供者的标准支持:ServiceLoader。您只需要求库的每个用户提供某个接口的实现,例如
public interface MessageBundleProvider {
List<MessageBundle> getBundles();
}
实现此接口的类的名称必须在名为 的用户库的 jar 文件中指定META-INF/services/com.example.MessageBundleProvider
。
在运行时,您的库将使用以下代码自动发现所有消息包提供程序:
private static final ServiceLoader<MessageBundleProvider> LOADER
= ServiceLoader.load(MessageBundleProvider.class);
private static final List<MessageBundle> BUNDLES;
static {
BUNDLES = new ArrayList<MessageBundle>();
for (MessageBundleProvider provider : loader) {
for (MessageBundle bundle : provider.getBundles()) {
BUNDLES.add(bundle);
}
}
}
免责声明:我知道 ServiceLoader 存在,但我以前从未使用过它。不过,这是发现所有标准 Java 服务提供者的方式(如 JDBC 驱动程序、字符集提供者等)。