簡體   English   中英

OSGi:如何獲取其他捆綁軟件的Classloader

[英]OSGi: How to get Classloader of other bundle

我正在運行一個Virgo-Tomcat-Server。 有一個EnumMap,其鍵為

bundle.a.MyEnum

該地圖的上下文是通過接收的

bundle.b

和使用SpelExpressionParser的Spring表達式語言,示例表達式將為“ get(T(bundle.a.MyEnum).SAMPLEKEY)”。 解析器(分別是其TypeLocator)需要訪問bundle.a的ClassLoader。

所以我做了:

TypeLocator typeLocator = new StandardTypeLocator(getBundleAClassLoader());
StandardEvaluationContext evaluationContext  = new StandardEvaluationContext();
evaluationContext.setTypeLocator(typeLocator);
spelExpressionParser = new SpelExpressionParser();
spelExpressionParser.parseExpression(expression)).getValue(evaluationContext, context);

問題是,在bundle.b的類中獲取bundle.a的類加載器的正確方法是什么? 經過幾次嘗試,我發現的唯一可行的解​​決方案是:

private static ClassLoader getBundleAClassLoader() {
    MyEnum bundleARef = MyEnum.SAMPLEKEY;
    return bundleARef.getClass().getClassLoader();
}

編輯:解決方案

getBundleAClassLoader()

沒有必要,

TypeLocator typeLocator = new StandardTypeLocator(this.getClass().getClassLoader());

工作正常。

這聽起來太復雜了。 只需在bundle.b的清單中執行Import-Package,就可以像訪問自己的類型一樣訪問該類型。

例如

SomeClassOfBundle.class.getClassLoader()

要么

bundle.adapt(BundleWiring.class).getClassLoader()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM