Inor

[JAVA] ClassLoader(JAVA : 클래스 로더의 구조) 본문

Computer Engineering/Java

[JAVA] ClassLoader(JAVA : 클래스 로더의 구조)

Inor 2017. 7. 12. 15:33

 클래스 로더는  컴파일러에의해서 컴파일된 *.class 파일의 자바 바이트 코드를 읽어서 JVM의 Execution Engine이 사용할 수 있도록 Runtime Data Area에 적재하는 역할을 하는 부분 입니다. 

 각각의 클래스 로더들은 부모와 자식 형태인 계층적인 모델을 취하고 있고 가장 최상위 클래스 로더는 Bootstrap Class Loader 입니다. 클래스를 로드 할때는 parent-first/child-last의 순서로 로드 합니다. 캐시->부모->자식의 순서로 클래스 로딩이 됩니다. 먼저 캐시에 해당 클래스가 있는지 확인하고 없을 경우에 부모 클래스 로더로 가서 부모 클래스 로더의 캐시를 확인하고 없을 경우에 다시 부모의 부모 클래스에게 요청하는 방식으로 클래스를 로딩 합니다. 또한, 자식 클래스 로더는 부모 클래스 로더에게 요청해서 클래스를 찾을 수 있지만 부모 클래스는 자식 클래스에게서 클래스를 찾을 수 없으며 자식 클래스가 로드한 클래스를 사용할 수 없습니다. 마지막으로 로드 된 클래스는 언로드 할 수 없습니다.



  • Bootstrap Class Loader : JVM이 실행될 때 실행 되는 클래스 로더로서 $JAVA_HOME/jre/lib 에 있는 JVM을 실행할 때 가장 기본이 되는 라이브러리들을 로드 하는 클래스 로더입니다.. 다른 클래스 로더와 다르게 자바가 아닌 네이티브로 구현된 클래스 로더 입니다.
  • Extensions Class Loader : 추가로 로딩되는 클래스들로 $JAVA_HOME/lib/ext/*.jar에 있는 클래스들을 로드 합니다. 이 클래스들은 별도의 CLASSPATH 설정 없이도 로딩이 됩니다.
  • System Class Loader : CLASSPATH에 정의 되거나 JVM 옵션에서 -cp, -classpath에 설정된 클래스들을 로드 합니다.
  • User-Defined Class Loader : 애플리케이션 코드에 사용자가 직접 정의해서 사용하는 클래스 로더 입니다.


동적 로딩


interface HelloInterface{
	public void sayHello();
}

class HelloWorld implements HelloInterface{
	public void sayHello(){
		System.out.println("hello world!");
	}
}

class HelloKorea implements HelloInterface{
	public void sayHello(){
		System.out.println("hello Korea!");
	}
}

public class RuntimeLoad {

	public static void main(String[] args) {
		try {
			Class<?> cls = Class.forName(args[0]);
			Object obj = cls.newInstance();
			HelloInterface hello = (HelloInterface)obj;
			hello.sayHello();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

	}

}


 위의 코드는 클래스를 동적으로 로딩하는 예제 코드 입니다. Class.forName() 메소드를 통해서 리턴 되는 클래스 객체는 해당 클래스의 객체를 리턴 하는 것이 아니라 메타 데이터를 리턴 합니다. cls.newInstance()를 통해서 객체화 되고 사용하고자하는 클래스 타입으로 적절히 캐스팅 해줘야 합니다.

 클래스 로더가 최초로 클래스를 로드 할 때 *.class 파일에서 클래스에대한 여러 정보를 추출 하고 개발자는 정보들을 확인할 수 있습니다. 이러한 클래스 정보를 보는 기법을 리플렉션 이라고 합니다.




참조



Comments