我正在编写一个正在启动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启动得很好。
任何想法出了什么问题或者我如何以合理的方式调试它?
答案 0 :(得分:0)
我弄清楚主要问题是什么:ContextClassloader与实际加载类的类加载器无关。
为解决我的问题,我负责使用类加载器在RCP程序的层次结构和框架的层次结构中加载swt显示类。这可以通过使用java扩展类加载器来实现。 (我无法使用应用程序类加载器,因为我的RCP应用程序不能作为父项使用它,我还没弄清楚为什么)这只是将swt.jar添加到java.ext.dirs的问题属性。
答案 1 :(得分:0)
如果您使用的是Eclipse RCP,那么您可以使用:
PlatformUI.getWorkbench()。getDisplay()