簡體   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