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