如何找出调用(共享)代码的捆绑包或插件?

时间:2011-05-24 09:13:19

标签: eclipse plugins singleton bundle rcp

我想创建类似' BundleLocal '变量的内容,就像 ThreadLocal 变量一样,但不是通过Thread.currentThread()查找它们我需要查看它们捆绑上下文。

关键是我有一个框架插件'F',以及其他使用该框架的插件'A','B'等。该框架包含一个我想重构的单例,这样我每个包有一个单例实例。然后MySingleton.getInstance()将为每个插件创建/返回一个专用实例。问题是在MySingleton.getInstance()内我需要找出哪个插件('A','B',..)称为该方法。

可以用黑客攻击,用

获取调用堆栈
StackTraceElement[] ste=new Throwable().getStackTrace();

然后按类查询每个元素的bundle上下文:

org.osgi.framework.FrameworkUtil.getBundle(Class c).getBundleContext()

但真心希望有更好的方法从框架'F'中获取bundle上下文或bundle id。

关于如何更优雅地做这件事的任何建议?

2 个答案:

答案 0 :(得分:1)

我建议从呼叫来源注入信息,而不是试图确定它来自何处。像这样:

MyMultiton.getInstance(bundleContext)

答案 1 :(得分:1)

由于OSGi(及其孤立的类加载器)的模块化特性,单例不起作用(正如您所发现的那样)。

如果您正在重构,一个选项就是简单地添加间接。在ActivatorA中:

public static Singleton getSingleton() {
    Framework.getSingleton(BUNDLE_ID);
}

然后插件A使用ActivatorA.getSingleton(),插件B使用ActivatorB.getSingleton()。

另一种可能的方法是提供ComponentFactory并使用Declarative Service将适当的Component(OSGi服务)注入插件A和插件B(每个人都获得自己的Component实例)。但这是我第一个例子的一个更动态,更分离的实现。