捆绑-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应该直接使用?
答案 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上使用的函数签名也包含返回类型。