Netbeans Lookup:使用注释定义 ServiceProvider,而不是通过文本/xml 文件

Mar*_*tin 5 java lookup netbeans netbeans-platform

我需要有最简单的方法通过外部 jar 提供接口的实现。我想避免使用文本/xml 文件,因为在重构类或接口名称时它可能会导致错误。

我尝试了 Netbeans Lookup,因为它有一个@ServiceProvider 注释,应该以声明性方式注册实现。

所以我写了一个简单的试用代码,它甚至没有将接口和提供者拆分到不同的jar中,但它仍然无法查找组件:

import org.openide.util.Lookup;
import org.openide.util.lookup.ServiceProvider;

public class LookupTrial {
public static void main(String[] args) {
    IService s = Lookup.getDefault().lookup(IService.class);
    if(s==null)
        throw new RuntimeException("lookup failed");
    else
        s.hello();
}

public interface IService{
    public void hello();
}

@ServiceProvider(service=IService.class)
public class MyImplementation implements IService{
    public MyImplementation(){}

    @Override
    public void hello() {
        System.out.println("hello lookup");
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我是否错误地使用了Lookup?我应该搜索另一个查找库来执行我想要的操作吗?

daj*_*ood 2

我找到了解决方案。该@ServiceProvider注释由 Netbeans IDE 以某种方式进行解析,并创建一个表示服务及其实现的映射的文件结构。如果您没有能够做到这一点的 IDE(我猜只有 NB 可以做到这一点),您可能必须手动创建这些文件,并且注释将不起作用。如果有人证明我错了,尤其是 Intellij IDEA,我会很高兴。

有关创建文件结构以使用 Lookup 的信息,请参阅此处

在 Netbeans 平台应用程序之外使用 Lookup API 的另一种方法可能是AbstractLookupInstanceContent类。看看这里如何使用它们。