确定 ServiceLocator 没有用户定义的服务

Determine ServiceLocator has no user defined services

我正在尝试制作一个可重用的组件,它根据居民文件中定义的服务创建 ServiceLocator。我需要确定 ServiceLocator 是否有除内置服务之外的服务。如果没有,可能会向用户记录一些警告。像

ServiceLocator locator =  ServiceLocatorUtilities.createAndPopulateServiceLocator();
List<?> services = locator.getAllServices(BuilderHelper.allFilter());
if (services.isEmpty()) {
    LOGGER.log(Level.WARNING, 
            "No services. Make sure inhabitants generator is working correctly.");
}

这当然行不通,因为 services 仍然包含所有内置服务。我可以创建一个 Filter

public class NonBuiltInFilter implements Filter {

    private static final Set<String> builtInClasses = new HashSet<>(
            Arrays.asList("org.jvnet.hk2.internal.ServiceLocatorImpl",
                          "org.jvnet.hk2.internal.ThreeThirtyResolver",
                          "org.jvnet.hk2.internal.DynamicConfigurationServiceImpl",
                          "org.jvnet.hk2.internal.DefaultClassAnalyzer",
                          "org.jvnet.hk2.internal.ServiceLocatorRuntimeImpl",
                          "org.jvnet.hk2.internal.InstantiationServiceImpl")
    );

    @Override
    public boolean matches(Descriptor d) {
        return !builtInClasses.contains(d.getImplementation());
    } 
}
...
List<?> services = locator.getAllServices(new NonBuiltInFilter());

现在可行,但这不是一个很好的解决方案,因为那些 类 可能随时更改。

所以我只是想知道除了内置服务之外,是否有任何标准方法可以检查 ServiceLocator 是否有任何服务。或者其他不像上面 Filter 那样脆弱的解决方法。

在 hk2-locator 模块中的最新版本的 hk2 中,有一个 API returns 您正在寻找的过滤器:

Hk2LocatorUtilities

这必须在实现模块中,因为另一个实现可能有一组不同的初始服务,所以它不是一个通用功能。鉴于此,我所知道的 hk2 没有其他实现,所以它仍然很通用!