[英]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.