Поиск отображения приложения RCP - PullRequest
0 голосов
/ 18 мая 2009

Я пишу среду тестирования, которая запускает приложение с графическим интерфейсом. Чтобы иметь возможность протестировать этот графический интерфейс в случае приложения SWT, мне нужно знать, что это дисплей. В общем, это отображение загружается другим загрузчиком классов, поэтому для решения этой задачи я использую метод findDisplay (Thread t) класса отображения swt путем отражения Мой код выглядит примерно так:

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 в текущей группе потоков. Однако я не получаю ничего для примера RCP texteditor, хотя графический интерфейс запускается отлично.

Есть идеи, что происходит не так или как я могу отладить это разумным способом?

Ответы [ 2 ]

0 голосов
/ 09 июня 2009

Если вы используете Eclipse RCP, то, возможно, вы можете использовать:

PlatformUI.getWorkbench (). GetDisplay ()

0 голосов
/ 20 мая 2009

Я понял, в чем заключается основная проблема: ContextClassloader не имеет ничего общего с загрузчиком классов, который фактически загружает классы.

Чтобы решить мою проблему, я позаботился о том, чтобы загрузчик классов загружал класс отображения swt как в иерархии программы RCP, так и в иерархии моей инфраструктуры. Это стало возможным с помощью загрузчика классов Java-расширения. (Я не мог использовать загрузчик классов приложения, так как мое приложение RCP не работает с ним как с родителем, я пока не выяснил, почему) Это был только вопрос добавления swt.jar в java.ext.dirs свойство.

...