표현할 java.lang.Class 클래스의 인스턴스를 생성합니다. 유형, 메소드 영역 이 클래스 액세스 입구
"전체 클래스 이름을 통해 클래스의 바이너리 스트림을 얻는 방법은 여러 가지가 있습니다."
zip 패키지에서 가져오기
네트워크에서 가져오기
동적 프록시 기술과 같은 런타임 계산 생성
...
"배열이 아닌 유형의 로딩 단계의 경우 내장된- Java 가상 머신의 클래스 로더에서 완료하거나 사용자 정의 클래스 로더를 사용하여 완료할 수 있습니다."
Link
"이번 연결 단계는 크게 검증, 준비, 분석 3단계로 나누어집니다."
검증
" 검증단계는 주로 클래스 파일 형식이 올바르고 실행 시 가상 머신의 보안을 위협하지 않는지 확인하기 위한 것입니다."
검증 단계에는 많은 규칙이 있지만 대략 다음 네 단계로 나뉩니다 "구체적인 내용은 자세히 설명하지 않겠습니다." "Java Virtual Machine에 대한 심층적인 이해"를 참조하세요. 이 기사에서는 메모리 할당에 대한 자세한 내용을 설명하지 않고 요약하고 클래스 로딩의 전체 과정을 파악하는 것을 선호합니다. 클래스의 정적 변수에 대해 기본값으로 초기화합니다."
그러면 어떤 상황에서 클래스 정적 변수의 필드 속성 테이블에 ConstantValue 속성이 존재합니까? ?
Class 정적 변수는 기본 데이터형으로 final로 수정됩니다
Class 정적 변수는 String형으로 final로 수정되며 리터럴 형태로 값이 할당됩니다
순서 클래스 파일 코드의 바이트를 쉽게 볼 수 있도록 IDEA에서 플러그인 jclasslib 바이트코드 뷰어를 다운로드했는데 이는 매우 편리했습니다. 다음 코드를 사용하여 바이트코드 형식으로 검증합니다
public class Person {
private static int age = 10;
private static final int length = 160;
private static final String name = "name";
private static final String loc = new String("loc");
}
로그인 후 복사
"따라서 길이 및 이름 속성은 준비 단계에서 ConstantValue에서 지정한 값이 할당됩니다."
"그러면 어느 단계에서 age 및 loc 속성이 할당됩니까? 초기화 단계입니다. 이에 대해서는 나중에 자세히 소개하겠습니다. 클래스, 인터페이스, 필드 및 메소드를 직접 참조로 》기호 참조: 기호 세트를 사용하여 참조된 대상을 설명합니다.
직접 참조, 대상에 대한 직접 포인터
저와 함께 다음과 같이 클래스를 작성하세요
public class Student {
private String name;
private int age;
public String getName() {
return this.name;
}
}
로그인 후 복사
필드를 예로 들면 이름과 나이에 해당하는 객체는 메모리 주소를 직접 가리키지 않고 문자열로 설명됩니다( 즉, 상징적 참조). 구문 분석 단계는 이러한 설명을 대상을 직접 가리키는 포인터(즉, 직접 참조)로 변환하는 것입니다
初始化
「执行类静态成员变量赋值语句和静态代码块中的语句」
我们把上面的Student代码改成如下形式
public class Student {
private String name;
private int age = 10;
private static int gender = 1;
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public Student() {
System.out.println("构造函数");
}
public String getName() {
return this.name;
}
}