OSGi:如何获取其他包的类加载器
OSGi: How to get Classloader of other bundle
我有一个处女座-Tomcat-服务器运行。有一个EnumMap,它的key是
bundle.a.MyEnum
此地图的上下文是通过
接收的
bundle.b
和 Spring 表达式语言使用 SpelExpressionParser,示例表达式为 "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 的 class 中获取 bundle.a 的 class 加载程序的正确方法是什么?
经过几次尝试,我找到的唯一可行的解决方案是:
private static ClassLoader getBundleAClassLoader() {
MyEnum bundleARef = MyEnum.SAMPLEKEY;
return bundleARef.getClass().getClassLoader();
}
编辑:解决方案
getBundleAClassLoader()
不需要,
TypeLocator typeLocator = new StandardTypeLocator(this.getClass().getClassLoader());
工作正常。
这听起来太复杂了。只需在 bundle.b 的 Manifest 中做一个 Import-Package 就可以像访问自己的类型一样访问类型。
例如
SomeClassOfBundle.class.getClassLoader()
或
bundle.adapt(BundleWiring.class).getClassLoader()
我有一个处女座-Tomcat-服务器运行。有一个EnumMap,它的key是
bundle.a.MyEnum
此地图的上下文是通过
接收的bundle.b
和 Spring 表达式语言使用 SpelExpressionParser,示例表达式为 "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 的 class 中获取 bundle.a 的 class 加载程序的正确方法是什么? 经过几次尝试,我找到的唯一可行的解决方案是:
private static ClassLoader getBundleAClassLoader() {
MyEnum bundleARef = MyEnum.SAMPLEKEY;
return bundleARef.getClass().getClassLoader();
}
编辑:解决方案
getBundleAClassLoader()
不需要,
TypeLocator typeLocator = new StandardTypeLocator(this.getClass().getClassLoader());
工作正常。
这听起来太复杂了。只需在 bundle.b 的 Manifest 中做一个 Import-Package 就可以像访问自己的类型一样访问类型。
例如
SomeClassOfBundle.class.getClassLoader()
或
bundle.adapt(BundleWiring.class).getClassLoader()