JVM 클래스 로드 메커니즘 상세 설명

4852 단어 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 를 불 러 올 수 없습니다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기