2

我对 OSGi 片段和Class.forName(). 下面的例子说明了我的问题。

我有一个第三方捆绑包Foo。我不能Foo以任何方式修改。该捆绑包包含以下类:

public class Serializer {
    public String summarizeClass(String className) {
        Class<?> myClass = Class.forName(className);
        ...
    }
}

Bar如果我从 bundle for调用此方法org.myPackage.MyClass,它将失败,因为MyClass它不在 bundle 的类路径上Foo

我可以简单地添加一个Foo.fragment具有依赖关系的片段Bar来修改 bundle 的类路径Foo吗?还是这种依赖只适用于片段中的类?

长话短说:Class.forName()当在 Host 包的一个类中执行时,OSGi 的语义是什么?是否包括:

  • 问:捆绑课程?答:是的。
  • 问:片段中包含的类?答:是的。资源
  • Q:导入的包和需要的bundle导出的包?答:是的。
  • Q:所有fragment的导入包和需要bundle导出的包?答:我不知道。
4

1 回答 1

5

请参阅 OSGi 核心规范 5.0.0 版的第 3.14 节。

摘要:您可以添加仅具有 Import-Package 标头或 Require-Bundle 标头的片段。这些标头中的子句附加到主机包中的相应标头中。因此,如果您添加:

 Fragment-Host:  Foo;version="[1,2)"
 Import-Package: org.myPackage;version="[1,2)"

然后 Foo 捆绑包将能够看到您的 MyClass。

请注意,其中的代码summarizeClass假设存在单个类空间并且类唯一标识特定类。但是,大型应用程序具有经常使用相同依赖项的冲突版本的依赖项树。因此,对于这些情况,这种假设是非常错误的。OSGi 保证任何类在解析时都能看到一致的类空间,尽管不同的包可以看到不同的类空间。这个特性要求 OSGi 知道你的包需要什么包。可悲的是, Class.forName 还有其他不好的品质(它将类固定在内存中)并且几乎总是完全没有必要的。

于 2013-09-09T09:25:07.733 回答