자바 가상 컴퓨터 클래스 적재:원리,실현 및 응용
자바 가상 머 신(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;
}
...
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.