[자바] 자바 클래스 로딩

클래스 로딩

클래스 로딩이란 런타임 동안 자바 클래스를 JVM에 동적으로 로드하는 것이다. 클래스 로더(class loader)는 그 역할을 하는 클래스 또는 인스턴스를 말하며 java.lang.ClassLoader 패키지에 추상 클래스 ClassLoader로 정의되어 있다. 클래스 로더는 자바 프로그램 실행을 위해 필요하므로 자바 런타임 환경(JRE)에 포함되어 있다.

클래스 로더는 클래스의 바이너리 이름을 전달받아 클래스의 정의를 구성하는 데이터를 찾거나 생성하려고 시도한다. 일반적으로 바이너리 이름을 파일 이름으로 변환한 다음 파일 시스템에서 해당 이름의 클래스 파일을 읽는다. 모든 Class 객체에는 해당 클래스를 로드한 ClassLoader에 대한 참조가 포함되어 있다.

애플리케이션은 자바 가상 머신이 클래스를 동적으로 로드하는 방식을 확장하기 위해 ClassLoader의 하위 클래스를 구현할 수 있다. ClassLoader 클래스는 델리게이션(delegation) 모델을 사용하여 클래스와 리소스를 검색한다. 모든 ClassLoader의 인스턴스에는 연결된 상위 클래스 로더가 존재하며, 클래스 또는 리소스를 찾으라는 요청을 받으면 ClassLoader 인스턴스는 클래스 또는 리소스를 검색하려고 시도하기 전에 상위 클래스 로더에 검색을 위임한다. 자바 가상 머신에 내장된 클래스 로더인 부트스트랩 클래스 로더(bootstrap class loader)는 그 자체로는 상위 클래스를 갖지 않으며 ClassLoader 인스턴스의 상위 클래스 역할을 할 수 있다.

일반적으로 자바 가상 머신은 해당 플랫폼의 로컬 파일 시스템에서 클래스를 로드한다. 예를 들어, UNIX 시스템에서는 CLASSPATH 환경 변수에 정의된 디렉토리에서 클래스를 로드한다. 일부 클래스는 로컬 파일 시스템이 아닌 네트워크와 같은 다른 소스로부터 가져오거나 애플리케이션에 의해 구성될 수도 있다. 이와 같이 클래스를 단순히 로드하는 대신 클래스를 구성하기 위해 ClassLoader 클래스는 defineClass() 메서드를 제공한다. defineClass() 메서드는 바이트 배열을 Class 클래스의 인스턴스로 변환한다. defineClass()를 통해 새로 정의된 클래스의 인스턴스는 Class 클래스의 메서드인 newInstance() 메서드를 사용하여 생성 가능하다.

클래스 로더가 생성한 인스턴스의 메서드와 생성자는 다른 클래스를 참조할 수 있다. 참조할 클래스를 확인하기 위해 자바 가상 머신은 해당 클래스를 생성한 클래스 로더의 loadClass() 메서드를 호출한다. loadClass() 메서드는 해당 바이너리 이름의 클래스를 로드하며 자바 가상 머신이 클래스 참조를 확인하기 위해 호출되는 메서드이다.

네트워크 통신을 통해 클래스 로더가 클래스를 로드하고 클래스의 인스턴스를 생성하는 예는 다음과 같다.

class NetworkClassLoader extends ClassLoader {
  String host;
  int port;

  public Class findClass(String name) {
    byte[] b = loadClassData(name);
    return defineClass(name, b, 0, b.length);
  }

  private byte[] loadClassData(String name) {
    // 네트워크 통신으로 클래스 데이터를 로드한다. 
    ...
  }
}

public class MyClassLoader {
  public static void main(String argv[]) throws Exception {
    ClassLoader loader = new NetworkClassLoader(host, port);
    
    // 클래스 로더로부터 클래스를 로드한다.
    Class c = loader.loadClass("클래스명");
    
    // 로드한 클래스의 인스턴스를 생성한다.
    Object o = c.newInstance();
  }
}


정적 클래스 로딩과 동적 클래스 로딩


스프링 devtools 클래스 로드

ClassCastException


참고

Categories: ,

Updated:

Comments