자바 가상 컴퓨터 클래스 적재:원리,실현 및 응용

머리말
        자바 가상 머 신(JVM)의 클래스 마 운 트 는 클래스 파일 에 포 함 된 바이트 코드 를 JVM 에 불 러 와 JVM 의 한 부문 으로 만 드 는 과정 을 말한다.
 
2.자바 가상 컴퓨터 의 클래스 로드 완료 와 응용
 
2.1  적재 과정 안내
        자바 에서 클래스 로 더 는 하나의 종 류 를 자바 가상 컴퓨터 에 불 러 오 려 면 세 가지 보 조 를 통 해 완성 해 야 합 니 다.적재,링크 와 초기 화,그 중에서 링크 는 검사,예비 와 해석 세 단계 로 나 눌 수 있 습 니 다.해석 을 제외 하고 다른 보 조 는 전달 에 따라 엄 격 히 완 성 됩 니 다.각 보 조 는 다음 과 같 습 니 다.
        불 러 오기:클래스 나 인터페이스의 바 이 너 리 데 이 터 를 찾 고 가 져 오기;        검사:가 져 오 는 클래스 나 인터페이스의 바 이 너 리 데이터 의 정확성 을 검색 합 니 다.        준비:클래스 의 정적 변 수 를 할당 하고 저장 공간 을 초기 화 합 니 다.        해석:기호 원용 을 직접 원용 으로 변환 하기;        초기 화:클래스 의 정적 변수 와 정적 자바 코드 블록 을 활성화 합 니 다.
        자바 가상 머 신 은 각 클래스 를 사용 하 는 첫 번 째 일 은 이러한 종류의 바이트 코드 를 불 러 오 는 것 입 니 다.클래스 바이트 코드 를 불 러 오 는 기능 은 클래스 로 더 에 의 해 이 루어 집 니 다.클래스 로 더 는 하나의 이름 에 따라 클래스 의 바이트 코드 데 이 터 를 찾 고 생 성 한 후 자바 가상 머 신 에 되 돌려 줍 니 다.가장 흔히 볼 수 있 는 클래스 로 더 는 불 러 올 클래스 이름 을.class 파일 이름 으로 변환 한 다음 파일 시스템 에서 이 파일 을 찾 아 내용 을 읽 는 것 입 니 다.이러한 로 더 는.class 파일 의 내용 을 자바 가상 컴퓨터 에 그대로 되 돌려 주 는 것 이 아 닙 니 다.예 를 들 어.class 파일 의 내용 을 자바 가상 컴퓨터 에서 사용 하 는 클래스 바이트 로 변환 해 야 합 니 다.자바 프로그램의 문자열 은.class 파일 로 컴 파일 된 후 UTF-8 인 코딩 으로 존재 하 며 자바 가상 머 신 에 불 러 온 후 유 니 코드 인 코딩 으로 변 환 됩 니 다.
        클래스 로 딩 할 때 하나의 원칙 에 따라"클래스 로 딩 기 는 클래스 의 계승 시스템 에 따라 위 에서 아래로 순서대로 로드 합 니 다".예 를 들 어"C 가 B 를 계승 하고 인터페이스 I 를 실현 하면 B 는 A 를 계승 합 니 다."클래스 로 더 는 C 를 불 러 올 때 불 러 오 는 순 서 는 A>B>I>C 입 니 다.(주:interface 는 class 처럼 자바 컴 파일 러 에 의 해 독립 된.class 파일 로 컴 파일 됩 니 다)
 
2.2  적재 완료
        JVM 의 클래스 마 운 트 는 ClassLoader 와 하위 클래스 SecureClassLoader 로 이 루어 집 니 다.자바 ClassLoader 는 주요 자바 가 작 동 할 때 시스템 구성 요소 입 니 다.실행 중 클래스 파일 을 찾 고 불 러 오 는 클래스 를 담당 합 니 다.자바 에서 ClassLoader 는 추상 적 인 클래스 로 자바 lang 에 있 습 니 다.
        JVM 이 실 행 될 때 세 개의 ClassLoader:Bootstrap ClassLoader,Extension ClassLoader,AppClassLoader 가 생 성 됩 니 다.Bootstrap 은 C++로 작 성 된 것 입 니 다.자바 에서 볼 수 없습니다.null 입 니 다.JVM 이 자체 적 으로 가지 고 있 는 클래스 로 더 입 니 다.자바.lang.*등 핵심 라 이브 러 리 를 불 러 옵 니 다.
        AppClassLoader 의 Parent 는 ExtClassLoader 이 고,ExtClassLoader 의 Parent 는 Bootstrap ClassLoader 입 니 다.
        시스템 은 왜 이렇게 많은 ClassLoader 류 를 각각 지정 해 야 합 니까?
        정 답 은 자바 가 동적 로 딩 류 이기 때 문 입 니 다.그러면 메모 리 를 절약 하고 무엇 을 로 딩 하 는 지 알 수 있 습 니 다.바로 이 이치 입 니 다.그러나 시스템 이 실 행 될 때 우리 의 이 응용 프로그램 과 어떤 종 류 를 로 딩 해 야 하 는 지 모 릅 니 다.그러면 이런 단계별 로 로드 하 는 방식 을 사용 합 니 다.
        (1)먼저 핵심 API 를 불 러 와 시스템 을 가장 기본 적 으로 작 동 하도록 한다.
        (2)확장 클래스 불 러 오기
        (3)사용자 정의 클래스 불 러 오기
 
2.3  불 러 오 는 응용 프로그램
일반적으로,우 리 는 가상 컴퓨터 의 클래스 를 이용 하여 불 러 올 때 추상 적 인 클래스 java.lang.ClassLoader 를 계승 하고 loadclass()를 다시 써 야 합 니 다.다음은 우리 가 예 를 들 어 그것 의 응용 을 설명 한다.
public abstract class MultiClassLoader extends ClassLoader{
    ...
    public synchronized Class loadClass(String s, boolean flag)throws ClassNotFoundException
    {
/*    s         */
        Class class1 = (Class)classes.get(s);

/*  s       */
        if(class1 != null)  return class1; 

/*    ClassLoader    */

try  {
            class1 = super.findSystemClass(s);
            return class1;
        }
        catch(ClassNotFoundException _ex)  {
            System.out.println(">> Not a system class.");
        }

/*    s     */
        byte abyte0[] = loadClassBytes(s);
        if(abyte0 == null)   throw new ClassNotFoundException();

/*           */
        class1 = defineClass(null, abyte0, 0, abyte0.length);
        if(class1 == null) throw new ClassFormatError();
        if(flag)   resolveClass(class1); /*   */

/*             */
        classes.put(s, class1);
        System.out.println(">> Returning newly loaded class.");

/*      、    */
        return class1;
    }
    ...
}


좋은 웹페이지 즐겨찾기