JVM 클래스 로드 메커니즘 상세 설명
2.연구 류 로드 메커니즘 의 의미
위의 그림 에서 알 수 있 듯 이 클래스 로 딩 은 자바 프로그램 이 실행 하 는 첫 번 째 단계 이 고 연구 류 의 로 딩 은 JVM 의 실행 과정 을 이해 하 는 데 도움 이 되 며 개발 자 에 게 더욱 효과 적 인 조 치 를 취해 프로그램 에 협조 하도록 지도 한다.
연구 류 로 딩 메커니즘 의 두 번 째 목적 은 프로그램 이 동태 적 인 통제 류 로 딩,예 를 들 어 열 배치 등 프로그램의 유연성 과 적응성 을 향상 시 키 는 것 이다.
3.클래스 로 딩 의 일반 과정
원리:부모 의뢰 모드
1.jre 디 렉 터 리 를 찾 아 jvm.dll 을 찾 고 JVM 을 초기 화 합 니 다.
2.Bootstrap Loader(시작 클래스 로 더)를 만 듭 니 다.
3.Bootstrap Loader 는 Extended Loader(표준 확장 클래스 로 더)를 자동 으로 불 러 오고 부모 Loader 를 Bootstrap Loader 로 설정 합 니 다.
4.Bootstrap Loader 는 AppClass Loader(시스템 클래스 로 더)를 자동 으로 불 러 오고 부모 Loader 를 Extended Loader 로 설정 합 니 다.
5.마지막 으로 AppClass Loader 에서 HelloWorld 류 를 불 러 옵 니 다.
4.클래스 로 더 의 특징
1.프로그램 을 실행 할 때 항상 AppClass Loader(시스템 클래스 로 더)에서 지정 한 클래스 를 불 러 옵 니 다.
2.클래스 를 불 러 올 때 각 클래스 의 로 더 는 로 딩 작업 을 아버지 에 게 맡 깁 니 다.아버지 가 찾 지 못 하면 스스로 불 러 옵 니 다.
3.Bootstrap Loader(시작 클래스 로 더)는 최고급 클래스 로 더 입 니 다.부모 로 더 는 null 입 니 다.
5.클래스 로 더 가 져 오기
쉽다
public class HelloWorld {
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
Class c = hello.getClass();
ClassLoader loader = c.getClassLoader();
System.out.println(loader);
System.out.println(loader.getParent());
System.out.println(loader.getParent().getParent());
}
}
인쇄 결과:sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
위의 결 과 를 통 해 알 수 있 듯 이 ExtClassLoader 의 부모 Loader 를 얻 지 못 했 습 니 다.이 유 는 Bootstrap Loader(시작 클래스 로 더)가 C 언어 로 이 루어 졌 기 때 문 입 니 다.부모 Loader 로 돌아 가 는 방법 을 찾 지 못 해 null 로 돌 아 왔 습 니 다.
클래스 로드
클래스 로 딩 은 세 가지 방식 이 있 습 니 다.
1.명령 행 시작 시 JVM 에서 로 딩 초기 화
2.Class.forName()방법 으로 동적 불 러 오기
3.ClassLoader.loadClass()방법 으로 동적 로드
세 가지 방식 의 차이 가 비교적 커서 예 를 보면 알 수 있다.
package zhongqiu.common.base;
public class ClassLoadDemo {
static {
System.out.println("ClassLoadDemo !");
}
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();
System.out.println(loader2);
// ClassLoader.loadClass() ,
// loader2.loadClass("zhongqiu.test.Test");
// Class.forName() ,
// Class.forName("zhongqiu.test.Test");
// Class.forName() , ClassLoader,
Class.forName("zhongqiu.test.Test", false, loader2);
}
}
7.사용자 정의 ClassLoader
package zhongqiu.common.base.classload;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
@SuppressWarnings("resource")
public static void main(String[] args)
throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");
ClassLoader myloader = new URLClassLoader(new URL[] { url });
Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");
Test t3 = (Test) c.newInstance();
}
}
Javalang 가방 에 ClassLoader 클래스 가 있 습 니 다.ClassLoader 의 기본 목 표 는 클래스 에 대한 요청 에 서 비 스 를 제공 하 는 것 입 니 다.필요 한 동적 으로 클래스 와 자원 을 불 러 오 는 것 입 니 다.하나의 클래스 가(new 키 워드 를 사용 하여 하나의 클래스 를 예화)할 때 만 클래스 로 더 를 불 러 오고 초기 화 할 수 있 습 니 다.자바 프로그램 은 다양한 종류의 클래스 로 더 를 사용 할 수 있 습 니 다.예 를 들 어 웹 애플 리 케 이 션 서버 에서 Servlet 의 로 딩 은 개발 업 체 가 정의 한 클래스 로 더 를 사용 하고 자바.lang.String 은 JVM 시스템 로 더,Bootstrap Class Loader 를 사용 하 며 개발 업 체 가 정의 하 는 다른 종 류 는 AppClassLoader 로 불 러 옵 니 다.JVM 에 서 는 클래스 이름과 클래스 로 더 가 다른 자바 형식 을 구별 합 니 다.따라서 JVM 은 서로 다른 로 더 를 사용 하여 같은 namespace 의 자바 류 를 불 러 올 수 있 으 며,실제로 같은 namespace 의 자바 류 는 완전히 다른 클래스 일 수 있 습 니 다.이런 메커니즘 은 JDK 가 자체 적 으로 가지 고 있 는 java.lang.String 이 유일 하 다 는 것 을 보증 할 수 있다.8.왜 이런 양친 위탁 모델 을 사용 합 니까?
중복 로드 를 피 할 수 있 기 때문에 아버지 가 이 종 류 를 불 러 왔 을 때 클 라 스 로 더 를 다시 불 러 올 필요 가 없습니다.
보안 요 소 를 고려 하여 이러한 위탁 모드 를 사용 하지 않 으 면 자바 핵심 api 에서 형식 을 정의 하 는 대신 사용자 정의 String 을 수시로 사용 할 수 있 습 니 다.그러면 매우 큰 안전 위험 이 존재 할 수 있 습 니 다.부모 가 의뢰 하 는 방식 은 이러한 상황 을 피 할 수 있 습 니 다.String 이 시작 할 때 불 러 오기 때 문 입 니 다.사용자 정의 클래스 는 사용자 정의 ClassLoader 를 불 러 올 수 없습니다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.