如何让所有 类 在特定 OSGi Bundle 中实现一个接口

How get all classes implementing an interface in a specific OSGi Bundle

我有一个名为 'Foo' 的接口,我有一个包 'b'。

现在我想在包 b

中获取所有 类 实现接口 'Foo'

类似下面的内容

org.osgi.framework.Bundle bundle = ...;
List<Class<? extends Foo>> allImplemetation = getAllImplementation(bundle);
  1. 在 OSGi 中查找实现的简洁方法是让每个包将每个实现发布为 OSGi 服务。这允许将 impl classes 保持私有,并确保您的中央包与用户包很好地分离。 Here you can find some guidance how to do this.

  2. 如果这不可能,那么您可以使用 BundleTracker 在安装新捆绑包时获得回电。然后,您可以使用 Javassist 或 XBean finder 扫描包 class 路径以查找实现和接口的 classes。但是,这种变体很难正确执行。所以我会尽量避免它。

  3. 一种中间解决方案是使用与 ServiceLoader 相同的方法。您在包含要加载的实现的 class 名称的 jars 中的一个特殊目录中创建一个文件。然后你可以像上面那样使用 BundleTracker 找到新安装的 bundle,读取这个资源然后使用 bundle 的 ClassLoader 加载实现 class.