繁体   English   中英

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

[英]OSGi classloading: why does BND imports classes that are not referenced directly?

捆绑-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() {
       ...
    }
}

Bundle-C:...

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

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

为什么BND会将OSGi导入包包含到com.foo.c中呢? 我的理解方式-包A仅需要包B便能自行解决。 另一方面,捆绑软件B需要C。但是,如果那里不使用A,为什么A要直接要求C?

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

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

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

猜猜您具有以下功能:

public class ListProvider {

    public static ArrayList getMyList() { return null; }

}

其他类则这样称呼它:

List myVar = ListProvider.getMyList();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM