OSGi类加载:为什么BND会导入未直接引用的类?

时间:2016-09-14 08:46:22

标签: java osgi classloader bnd

捆绑-A:

FooA.java

package com.foo.a;

import com.foo.b.FooB;

class FooA {
    FooB b = new FooB();
}

捆绑-B:

FooB.java:

package com.foo.b;

import com.foo.c.FooC;

class FooB {

    public FooC foo() {
       ...
    }
}

捆绑-C: ...

简而言之,我有3个捆绑包 - A,B和C.

Bundle A直接引用bundle B,Bundle B引用C. 如您所见,FooA不使用返回FooC的FooB中的方法,因此不会直接在包A中引用FooC。

为什么BND包括OSGi import-package到com.foo.c呢? 我理解它的方式 - 捆绑A只需要捆绑B才能自行解决。另一方面,捆绑B需要C.但是如果A不在那里使用,为什么A应该直接使用?

2 个答案:

答案 0 :(得分:2)

我认为bnd会为您使用的类导入外部可见的所有类。当您使用类FooB时,您可能需要访问它可能需要的所有类作为参数或作为结果返回。

如果您想避免依赖,可以创建一个仅显示您真正需要的方法的界面。然后,您可以在捆绑包B中使用该接口创建服务,并仅使用捆绑包A中的接口访问服务。

答案 1 :(得分:2)

查看FooA类的字节码。你会以某种方式看到FooC。使用Java Decompiler工具查看其使用原因。一些反编译器创建的代码显示比原始java代码更多的信息。我没有在这里看到,为什么,但这是另一个例子:

猜猜你有以下功能:

public class ListProvider {

    public static ArrayList getMyList() { return null; }

}

其他课程称之为:

List myVar = ListProvider.getMyList();

您将在另一个类的字节码中看到ArrayList。原因是字节码leven上使用的函数签名也包含返回类型。