문제

GUI 응용 프로그램을 시작하는 테스트 프레임 워크를 작성하고 있습니다. SWT 응용 프로그램의 경우이 GUI를 테스트하려면 디스플레이라는 것을 알아야합니다. 일반적 으로이 디스플레이는 다른 클래스 로더에 의해로드 되므로이 작업을 수행하기 위해 반사를 통해 SWT 디스플레이 클래스의 Method FindDisplay (스레드 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;
    }
}

제 생각에는 이것은 현재 스레드 그룹에서 유형 디스플레이의 모든 객체를 찾아야합니다. 그러나 GUI가 완벽하게 시작하고 있지만 Texteditor RCP 예제에 대해서는 얻지 못합니다.

어떤 아이디어가 잘못되고 있는지 또는 어떻게 합리적인 방식으로 이것을 디버깅 할 수 있습니까?

도움이 되었습니까?

해결책

주요 문제는 무엇인지 알아 냈습니다. 컨텍스트 클래스 로더는 실제로 클래스를로드 한 클래스 로더와 관련이 없었습니다.

내 문제를 해결하기 위해 RCP 프로그램의 계층 구조와 내 프레임 워크의 계층 구조에 SWT 디스플레이 클래스를로드하는 클래스 로더를 처리했습니다. Java Extension Classloader를 사용하여 가능했습니다. (RCP 응용 프로그램이 부모로서 작동하지 않기 때문에 응용 프로그램 클래스 로더를 사용할 수 없었습니다. 아직 이유를 알아 내지 못했습니다.) 재산.

다른 팁

Eclipse RCP를 사용하는 경우 사용할 수 있습니다.

PlatformUi.getWorkBench (). getDisplay ()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top