더북(TheBook)

4.4.4 컨텍스트 클래스 로더


대부분은 클래스 로딩 과정을 신경 쓰지 않아도 된다. 클래스는 다른 클래스에서 사용될 때 투명하게(즉, 아무도 모르게) 로드된다. 하지만 클래스를 동적으로 로드하는 메서드가 있고, 또 다른 클래스 로더로 로드된 클래스에서 이 메서드를 호출하면 문제가 생길 수 있다. 구체적으로 예를 들어 문제를 살펴보자.

1. 시스템 클래스 로더가 로드하는 유틸리티 클래스를 만들었고, 이 클래스에는 다음 메서드가 있다.

public class Util {

    Object createInstance(String className) {

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

        ...

    }

    ...

}


2. 플러그인 JAR에서 클래스를 읽어 오는 또 다른 클래스 로더로 플러그인을 로드한다.

3. 이 플러그인은 Util.createInstance("com.mycompany.plugins.MyClass")를 호출해 플러그인 JAR에 들어 있는 클래스의 인스턴스를 생성한다.

플러그인 작성자는 이 클래스가 정상적으로 로드될 것이라고 예상한다. 하지만 Util.createInstance는 자체적인 클래스 로더를 사용해 Class.forName을 실행하므로 해당 클래스 로더는 플러그인 JAR를 찾지 못한다. 이 현상을 클래스 로더 역전(classloader inversion)이라고 한다.

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