gpt4 book ai didi

java - 在注释处理器中使用 ServiceLoader

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:36 27 4
gpt4 key购买 nike

是否可以在注释处理器的 init(ProcessingEnvironment) 方法中使用 ServiceLoader

 interface Service {}

class AnnotationProcessor extends AbstractProcessor {

public static void main(String[] args) {
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}

@Override
public synchronized void init(ProcessingEnvironment env) {
super.init(env);

ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}

...
}

运行 main 方法会生成我在 META-INF/services 文件中指定的服务。但是,当 init(ProcessingEnvironment) 方法作为另一个项目构建的一部分被调用时,它不会列出任何服务。

有没有办法让它工作?

最佳答案

问题是 ServiceLoader 使用 Thread.currentThread().getContextClassLoader() 时未指定 ClassLoader 无法从 META-INF\services 文件中查看Annotation Processor 但可以来自 main 方法。

使用 ServiceLoader.load(Service.class, AnnotationProcessor.class.getClassLoader()) 从 AnnotationProcessor 中正确加载服务。

(如果您知道为什么 ContextClassLoader 看不到 META-INF\services,请随时添加到我的答案中)

关于java - 在注释处理器中使用 ServiceLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45061170/

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