如何让所有 类 在特定 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);
在 OSGi 中查找实现的简洁方法是让每个包将每个实现发布为 OSGi 服务。这允许将 impl classes 保持私有,并确保您的中央包与用户包很好地分离。 Here you can find some guidance how to do this.
如果这不可能,那么您可以使用 BundleTracker 在安装新捆绑包时获得回电。然后,您可以使用 Javassist 或 XBean finder 扫描包 class 路径以查找实现和接口的 classes。但是,这种变体很难正确执行。所以我会尽量避免它。
一种中间解决方案是使用与 ServiceLoader 相同的方法。您在包含要加载的实现的 class 名称的 jars 中的一个特殊目录中创建一个文件。然后你可以像上面那样使用 BundleTracker 找到新安装的 bundle,读取这个资源然后使用 bundle 的 ClassLoader 加载实现 class.
我有一个名为 'Foo' 的接口,我有一个包 'b'。
现在我想在包 b
中获取所有 类 实现接口 'Foo'类似下面的内容
org.osgi.framework.Bundle bundle = ...;
List<Class<? extends Foo>> allImplemetation = getAllImplementation(bundle);
在 OSGi 中查找实现的简洁方法是让每个包将每个实现发布为 OSGi 服务。这允许将 impl classes 保持私有,并确保您的中央包与用户包很好地分离。 Here you can find some guidance how to do this.
如果这不可能,那么您可以使用 BundleTracker 在安装新捆绑包时获得回电。然后,您可以使用 Javassist 或 XBean finder 扫描包 class 路径以查找实现和接口的 classes。但是,这种变体很难正确执行。所以我会尽量避免它。
一种中间解决方案是使用与 ServiceLoader 相同的方法。您在包含要加载的实现的 class 名称的 jars 中的一个特殊目录中创建一个文件。然后你可以像上面那样使用 BundleTracker 找到新安装的 bundle,读取这个资源然后使用 bundle 的 ClassLoader 加载实现 class.