0

我正在编写一个正在启动 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 类型的对象。但是,尽管 GUI 正在完美启动,但我没有得到任何文本编辑器 RCP 示例。

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

4

2 回答 2

0

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

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

于 2009-05-20T11:15:37.163 回答
0

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

PlatformUI.getWorkbench().getDisplay()

于 2009-06-09T12:01:18.287 回答