기본 Java 클래스 로딩 프로세스에 대한 자세한 소개
기본 프로세스 :
- 클래스의 자격있는 이름을 기반으로 클래스를 정의하는 이진 바이트 스트림을로드하십시오.
- 바이트 스트림으로 표시되는 정적 저장 구조를 메소드 영역의 런타임 데이터 구조로 변환
- 메모리 에서이 클래스를 나타내는 java.lang.class 객체를 생성 하고이 클래스의 다양한 데이터 액세스 포털에 액세스하는 방법으로 사용하십시오.
배열 클래스 자체는 클래스 로더를 통해 생성되지 않지만 Java Virtual Machine에서 직접 생성되며 배열 클래스의 요소 유형은 클래스 로더에 의해로드됩니다.
배열 클래스의 요소 유형 : 모든 치수를 제거한 후 배열 유형.
파일 형식 확인 :
- 0xcafebaby는 마술 번호로 시작합니다.
- 현재 가상 머신은 기본 및 보조 버전 번호를 처리 할 수 있습니다.
- 일정한 유형;
- 인덱스 실행 유형;
- UTF8 인코딩 된 데이터 유형,
메타 데이터 검증 : 바이트 코드 설명 정보의 시맨틱 분석 :
- 부모 수업이 있는지 여부;
- 부모 클래스가 최종 수정 클래스를 상속하는지 여부;
- 추출되지 않은 클래스가 부모 클래스 또는 인터페이스에서 구현 해야하는 방법을 구현하는지 여부;
- 클래스에서 필드와 방법의 덮어 쓰기, 오버로드 모순;
바이트 코드 검증 : 시맨틱 흐름 및 제어 흐름 분석 및 방법 본문 분석 검증을 통해 프로그램의 합법성과 정확성을 결정하십시오.
- 기호 참조 검증 : 가상 머신이 구문 분석 단계에서 기호 참조를 직접 참조로 변환하면 클래스 외부의 정보에 대해 일치하는 검증을 수행합니다.
- 해당 클래스가 상징적 참조로 문자로 설명 된 완전히 자격을 갖춘 이름으로 찾을 수 있는지 여부;
- 메소드 필드와 일치하는 클래스에 설명자가 있는지 여부와 간단한 이름으로 설명 된 메소드 및 필드가 지정됩니다.
- 상징적 참조로 수업, 분야 및 방법의 접근성.
준비 : 방법 영역에서 클래스 변수에 대한 메모리를 할당하고 클래스 변수의 초기 값을 설정하십시오.
- 초기 값은 일반적으로 데이터 유형의 0 값이며 최종 수정 된 값은 해당 값으로 직접 초기화됩니다.
- 클래스 변수는 인스턴스 변수와 구별되는 정적으로 수정 된 변수입니다.
분석 : 가상 머신은 Constant Pool의 상징적 참조를 직접 참조 프로세스로 대체합니다.
constant_class_info, constant_fieldref_info, constant_methodref_info ..
- 기호 참조 : 기호 집합은 참조 된 대상을 설명합니다. 모든 형태의 리터럴은 모호한 대상을 찾는 데 사용될 수 있습니다. 가상 머신 메모리 구현과 관련이 없으며 참조 대상이로드되는지 여부에 관계없이 아무 관련이 없습니다.
- 직접 참조 : 대상에 직접 포인터, 오프셋 또는 대상에 간접적으로 위치한 핸들은 가상 머신에서 구현 된 메모리와 관련이 있습니다. 직접 참조 관련 대상 객체를로드해야합니다.
- . . .
초기화 : 클래스 정의에서 Java 프로그램 코드 실행을 시작합니다. 클래스 생성자 <cinit> () 메소드를 실행하고
<cinit> () :
- 컴파일러는 클래스 파일의 정의 순서에 따라 클래스에서 클래스 변수의 할당 동작을 자동으로 수집하고 정적 문 블록의 문을 병합합니다. 정적 명령문 블록은 이전에 정의 된 변수에만 액세스 할 수 있습니다.
- 클래스 생성자와는 달리, 부모 클래스 생성자를 표시된대로 호출 할 필요는 없습니다. 가상 머신은 서브 클래스가 실행되기 전에 부모 클래스 <cinit> ()가 실행되도록합니다.
- 부모 클래스의 정적 명령문 블록이 먼저 실행됩니다.
- <cinit> ()는 클래스 나 인터페이스에 필요하지 않으며 가변 할당 조작 또는 정적 명령문 블록이없는 경우 생성되지 않습니다.
- 인터페이스의 <cinit> ()는 먼저 부모 인터페이스의 <cinit> ()를 실행할 필요가 없으며 동일한 인터페이스 구현 클래스 <cinit> ()가 필요하지 않습니다.
- 스레드 안전 : 가상 머신은 <cinit> ()가 멀티 스레드 환경에서 올바르게 잠겨 있고 동기화되도록합니다. 하나의 스레드만이 초기화 클래스의 <cinit> ()에 동시에 액세스 할 수 있습니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!