더북(TheBook)

한 가지 해결 방법은 클래스 로더를 유틸리티 메서드에 전달한 후 이를 다시 forName 메서드에 전달하는 것이다.

public class Util {

    public Object createInstance(String className, ClassLoader loader) {

        Class<?> cl = Class.forName(className, true, loader);

        ...

    }

    ...

}


또 다른 해결 방법은 현재 스레드의 컨텍스트 클래스 로더(context class loader)를 사용하는 것이다. 메인 스레드의 컨텍스트 클래스 로더는 시스템 클래스 로더다. 새 스레드가 생성될 때 해당 스레드의 컨텍스트 클래스 로더는 생성하는 쪽 스레드의 컨텍스트 클래스 로더로 설정된다. 결국 그대로 두면 모든 스레드의 컨텍스트 클래스 로더는 시스템 클래스 로더로 설정된다. 하지만 다음과 같이 호출하면 원하는 클래스 로더로 설정할 수 있다.

Thread t = Thread.currentThread();

t.setContextClassLoader(loader);

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.