OSGi:如何获得其他bundle的Classloader

时间:2017-02-21 10:04:21

标签: java osgi osgi-bundle eclipse-virgo

我有一个Virgo-Tomcat-Server正在运行。有一个EnumMap,其关键是

bundle.a.MyEnum

此地图的上下文通过

接收
bundle.b

和使用SpelExpressionParser的Spring表达式语言,示例表达式将是" get(T(bundle.a.MyEnum).SAMPLEKEY)"。 Parser(分别是它的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());

工作正常。

2 个答案:

答案 0 :(得分:1)

这听起来太复杂了。只需在bundle.b的清单中执行Import-Package,就可以使用与自己类型相同的方式访问该类型。

答案 1 :(得分:1)

e.g。

SomeClassOfBundle.class.getClassLoader()

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