자바 클래스 로 더 와 클래스 반사 사용 예제

3048 단어 자바반사
프로 세 스 에 대응 하 는 명령
이 프로 세 스 가 아무리 복잡 하 더 라 도 자바 프로그램 을 시작 합 니 다.main 방법 을 시작 할 때 자바 가상 컴퓨터 프로 세 스 를 시작 합 니 다.서로 다른 JVM 프로 세 스 는 서로 영향 을 주지 않 습 니 다.자바 프로그램 은 입구 인 main 방법 만 있 고 가상 컴퓨터 를 호출 하 는 이유 다.한편,두 개의 mian 방법 은 2 개의 JVM 프로 세 스 에 대응 하고 서로 다른 종류의 로 더 를 시작 하 며 실제 적 으로 다른 종 류 를 작 동 합 니 다.그래서 서로 영향 을 주지 않 는 다.
2.클래스 로드.
이 클래스 가 메모리 에 불 러 오지 않 으 면 시스템 은 불 러 오기,연결,초기 화 를 통 해 클래스 를 초기 화 합 니 다.
1.클래스 로 딩:클래스 의 class 파일 을 JVM 에 읽 고 Class 대상 을 만 드 는 것 을 말 합 니 다.
2.클래스 연결:클래스 의 바 이 너 리 데 이 터 를 JRE 에 통합 하 는 것 을 말 하 는데 이것 은 3 단계 로 나 뉜 다.
a),검사:Class 파일 데 이 터 를 불 러 오 는 정확성 을 검사 합 니 다.
b),준비:클래스 의 정적 변수 에 저장 공간 을 할당 하고 기본 초기 화 합 니 다.
c),해석:클래스 의 바 이 너 리 데이터 의 기호 인용 을 직접 참조 로 바 꿉 니 다.
3.초기 화:클래스 의 정적 변수,정적 초기 화 블록 을 초기 화 합 니 다.
(메모:final 형식의 정적 속성 입 니 다.컴 파일 할 때 속성 값 을 얻 었 다 면 이 속성 을 호출 할 때 이 종 류 를 초기 화 하지 않 습 니 다.이것 은 상수 에 해당 하기 때 문 입 니 다.
ClassLoader()방법 을 사용 합 니 다.이 종 류 를 불 러 올 뿐 초기 화 되 지 않 았 습 니 다.)
3.클래스 로 더.
클래스 로 더 는.class 파일 을 메모리 에 불 러 오고 이에 대응 하 는 자바.lang.class 대상 을 만 드 는 것 입 니 다.모든 클래스 를 불 러 오 는 것 을 책임 집 니 다.한 클래스 가 JVM 에 불 러 오 면 다시 불 러 오지 않 습 니 다.
자바 에서 하나의 종 류 는 전체 한정 유형(즉,가방 명+유형 명)을 표지 로 한다.
한편,JVM 에서 하 나 는 전체 한정 유형 과 그 유형의 로 더 를 표지 로 한다.
JVM 이 실 행 될 때 3 개의 ClassLoader 가 발생 합 니 다.각각 BootstrapClassLoader(루트 로 더),ExtClassLoader(확장 로 더)와 AppClassLoader(시스템 클래스 로 더)입 니 다.UML 구 조 는 다음 과 같다.
그 중에서 BootstrapClassLoader 는 JRE 의 핵심 라 이브 러 리 를 불 러 옵 니 다.ClassLoader 의 하위 클래스 가 아 닙 니 다.C++로 작 성 됩 니 다.따라서 자바 에서 볼 수 없습니다.하위 클래스 의 getParent()방법 으로 가 져 올 때 null 로 돌아 갑 니 다.BootstrapClassLoader 는 JRE 목표 의 rt.jar,charsets.jar 등 자바 핵심 라 이브 러 리 를 불 러 옵 니 다.
그림 에서 알 수 있 듯 이 ExtClassLoader 와 AppClassLoader 는 ClassLoader 의 하위 클래스 입 니 다.API 에서 볼 수 없습니다.그들 은 rt.jar 파일 에 있 습 니 다.전체 한정 유형 명 은 다음 과 같다.
sun.misc.Launcher$ExtClassLoader 와 sun.misc.Launcher$AppClassLoader.
이 가운데 ExtClassLoader 는 JRE 확장 디 렉 터 리 ext 의 JAR 패 키 지 를 불 러 오고,AppClassLoader 는 Classpath 경로 의 클래스 패 키 지 를 불 러 옵 니 다.
테스트 는 다음 과 같 습 니 다:

package com.stopTalking.crazy;
public class TestClassLoader {
public static void main(String[] args) {
//  
ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
// System  
ClassLoader loader1 = System.class.getClassLoader(); 
// TestClassLoader loader2 
ClassLoader loader2 = TestClassLoader.class.getClassLoader(); 
// loader2  
ClassLoader loader3 = loader2.getParent(); 
// loader2  
ClassLoader loader4 = loader3.getParent(); 
System.out.println(loader); 
System.out.println(loader1); 
System.out.println(loader2); 
System.out.println(loader3); 
System.out.println(loader4); 

}
콘 솔 출력:

// AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
//System ,java , null
null
// AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
null

좋은 웹페이지 즐겨찾기