查找RCP应用程序的显示

时间:2009-05-18 09:14:27

标签: reflection swt eclipse-rcp classloader

我正在编写一个正在启动GUI应用程序的测试框架。为了能够在SWT应用程序的情况下测试此GUI,我需要知道它的显示。通常,此显示由另一个类加载器加载,因此我通过反射使用swt Display类的方法findDisplay(Thread t)来完成此任务。我的代码看起来像这样:

Thread[] threads = new Thread[10];
Thread.enumerate(threads);
Object foundObject = null;
for (Thread t : Arrays.asList(threads)){
    foundObject = null;
    Class<?> clazz = t.getContextClassLoader().loadClass("org.eclipse.swt.widgets.Display");
    final Method method = clazz.getMethod("findDisplay", Thread.class);
    foundObject = method.invoke(null, new Object[] {t});
    if (foundObject != null) {
        System.out.println("yeah, found it!");
        break;
    }
}

在我看来,这应该在当前线程组中找到Display类型的每个Object。但是我没有得到任何针对短信的RCP示例,尽管GUI启动得很好。

任何想法出了什么问题或者我如何以合理的方式调试它?

2 个答案:

答案 0 :(得分:0)

我弄清楚主要问题是什么:ContextClassloader与实际加载类的类加载器无关。

为解决我的问题,我负责使用类加载器在RCP程序的层次结构和框架的层次结构中加载swt显示类。这可以通过使用java扩展类加载器来实现。 (我无法使用应用程序类加载器,因为我的RCP应用程序不能作为父项使用它,我还没弄清楚为什么)这只是将swt.jar添加到java.ext.dirs的问题属性。

答案 1 :(得分:0)

如果您使用的是Eclipse RCP,那么您可以使用:

  

PlatformUI.getWorkbench()。getDisplay()