gpt4 book ai didi

java - 有没有类似Java 1.5中的ServiceLoader的东西?

转载 作者:太空狗 更新时间:2023-10-29 22:51:55 26 4
gpt4 key购买 nike

如何在运行时发现类路径中实现已定义接口(interface)的类?

ServiceLoader 很适合(我想,我没用过),但我需要在 Java 1.5 中使用它。

最佳答案

Java 1.5 中没有为此内置任何内容。我自己实现了;这不是太复杂。但是,当我们升级到 Java 6 时,我将不得不将对我的实现的调用替换为对 ServiceLoader 的调用。我本可以在应用程序和加载程序之间定义一个小桥梁,但我只在几个地方使用它,而包装器本身将是 ServiceLoader 的一个很好的候选者。

这是核心思想:

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;
}

更好的异常处理留给读者作为练习。此外,该方法可以参数化以接受调用者选择的 ClassLoader。

关于java - 有没有类似Java 1.5中的ServiceLoader的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com