ClassLoader2
자바 2 플랫폼에서 클래스로더의 인터페이스와 semantic은 개발자들이 자바 클래스로딩 메너니즘을 빠르고 쉽게 확장할 수 있도록 하기 위해 몇몇 부분을 재정의되었습니다. 그 결과 1.1이나 1.0에 맞게 작성된 (커스텀 클래스로더를 포함합니다.) 클래스로더는 자바 2 플랫폼에서는 제기능을 하지 못할 수도 있으며, 클래스로더 사용하기 위해 작성했던 코드를 재작성하는 것이 그렇게 간단하지만은 않습니다.
자바 1.x와 자바 2에서 클래스로더에 있어서 가장 큰 차이점은 자바 2의 클래스로더는 부모 클래스로더(상위 클래스가 아닙니다)를 갖고 있다는 점입니다.
자바 1.x의 클래스로더와는 달리, 자바 2의 클래스로더는 부모 클래스로더가 먼저 클래스를 로딩하도록 합니다.
이를 클래스로더 딜리게이션 모델(ClassLoader Delegation Model)이라고 하며, 이것이 바로 이전 버전의 클래스로더와 가장 큰 차이점이다.
자바 2의 클래스로더 딜리게이션 모델에 대해 구체적으로 알아보기 위해 로컬파일시스템과 네트워크로부터 클래스를 읽어와야 할 필요가 있다고 가정해봅니다.
이 경우, 쉽게 로컬파일시스템의 jar 파일로부터 클래스를 읽어오는 클래스로더와 네트워크로부터 클래스를 읽어오는 클래스로더가 필요하다는 것을 생각할 수 있습니다.
이 두 클래스로더를 각각 JarFileClassLoader와 NetworkClassLoader라고 가정 합니다.
JDK 1.1에서, 커스텀 클래스로더를 만들기 위해서는 ClassLoader 클래스를 상속받은 후에 loadClass() 메소드를 오버라이딩하고, loadClass() 메소드에서 바이트코드를 읽어온 후, defineClass() 메소드를 호출하면 됩니다.
여기서 defineClass() 메소드는 읽어온 바이트코드로부터 실제 Class 인스턴스를 생성해서 리턴합니다. 예를 들어, JarFileClassLoader는 다음과 같은 형태를 지닐 것입니다.
public class JarFileClassLoader extends ClassLoader {
........
private byte[] loadClassFromJarFile(String className){
// 지정한 jar 파일로부터 className에 해당하는 클래스의
// 바이트코드를 byte[] 배열로 읽어온다.
.......
return byteArr;
}
public synchronized class loadClass(String className, boolean resolveIt) throws ClassNotFoundException {
Class klass = null;
//클래스를 로드할 때, 캐시를 사용할 수 있다.
klass = (Class) cache.get(className);
if (klass != null) return klass;
// 캐쉬가 없을 경우, 시스템 클래스로더로 부터
// 지정한 클래스가 있는지 알아봅니다.
try{
klass = super.findSystemClass(className);
return klass;
}catch(ClassNotFoundException ex){
// do nothing
}
// Jar 파일로부터 className이 나타내는 클래스를 읽어온다.
byte[] byteArray = loadClassFromJarFile(className);
klass = defineClass(byteArray, 0, byteArray.length);
if (resolve)
resolveClass(klass);
cache.put(className, klass); // 캐쉬에 추가
return klass;
}
}
위의 개략적인 코드를 보게되면, 시스템 클래스로더에게 이름이 className인 클래스가 존재하는지 요청을 합니다.
(여기서 시스템 클래스로더 또는 primordial 시스템 클래스로더는 부트스트랩 클래스로더입니다). 그런 후에, 시스템 클래스로더로부터 클래스를 읽어올 수 없는 경우 Jar 파일로부터 읽어옵니다. 이 때, className은 완전한 클래스 이름(qualified class name; 즉, 패키지이름을 포함한)입니다. NetworkClassLoader 클래스 역시 이 클래스와 비슷한 형태로 이루어져 있을 것입니다.
'JAVA' 카테고리의 다른 글
[JAVA] CMYK 이미지 처리 (0) | 2017.11.01 |
---|---|
[JAVA] CmmProgramService 가져와 실행해 봅시다. (0) | 2017.11.01 |
[JAVA] ClassLoader (0) | 2017.10.30 |
[JAVA]classes 위치 가져오기 (0) | 2017.10.30 |
[JAVA] Class.forName 사용하기 (0) | 2017.10.30 |