JAVA 클래스 로드 메커니즘 설명(권장)

JAVA 소스 컴파일은 다음 세 가지 프로세스로 구성됩니다.
1. 원본 컴파일 메커니즘.
2. 클래스 로드 메커니즘
3. 클래스 실행 메커니즘
우리는 여기에서 주로 컴파일과 클래스 불러오는 이 두 가지 메커니즘을 소개한다.
1. 원본 컴파일
코드 컴파일은 JAVA 소스 컴파일러가 수행합니다.주로 원본 코드를 바이트 파일 (class 파일) 으로 컴파일합니다.바이트 코드 파일 형식은 주로 두 부분으로 나뉘는데 그것이 바로 상량 탱크와 방법 바이트이다.
클래스 로드
클래스의 생명 주기는 가상 머신 메모리에 불러오는 것부터 시작해서 메모리를 마운트 해제하는 것까지 끝납니다.과정은 모두 7단계가 있는데, 그 중에서 초기화 전까지는 모두 클래스 불러오는 부분에 속한다
로드 ---검증 ---준비 ---확인 ---초기화 ---사용 ---제거
시스템은 처음에 어떤 클래스를 사용할 때 이 클래스를 불러올 수도 있고 미리 불러오는 메커니즘으로 어떤 클래스를 불러올 수도 있다. 어떤 자바 프로그램을 실행할 때 자바 가상 머신 프로세스를 시작할 수도 있다. 두 번 실행된 자바 프로그램은 두 개의 다른 JVM 프로세스에 있고 두 개의 jvm 사이에 데이터가 공유되지 않는다.
1. 로드 단계
이 프로세스의 로드는 클래스 로드 메커니즘의 한 단계입니다. 이 두 개념을 혼동하지 마세요. 이 단계에서 완성해야 할 일은 다음과 같습니다.
1) 클래스의 한정된 이름을 통해 이러한 바이트 흐름을 정의합니다.
2) 이 바이트 흐름이 대표하는 정적 저장 구조를 방법 구역의 운행 시 데이터 구조로 전환한다.
3) 자바 더미에서 이 클래스를 대표하는 클래스 대상을 생성하여 접근 방법 구역에서 이 데이터의 입구로 삼는다.
첫 번째는 클래스의 바이트 흐름을 어디서 얻고 어떻게 얻는지 가리키지 않았기 때문에 이 구역은 개발자에게 큰 발휘 공간을 남겨 주었다.이것은 내가 뒤에 있는 클래스 캐리어에서 소개하고 있다.
2. 준비 단계
이 단계는 정식으로 클래스 변수(static에 의해 수식된 변수)에 메모리를 분배하고 클래스 변수의 초기 값을 설정합니다. 이 메모리 분배는 방법 구역에서 발생합니다.
1. 여기에 실례 변수를 메모리 할당하지 않았습니다. 실례 변수는 대상이 실례화될 때 대상과 함께 JAVA 더미에 분배됩니다.
2. 여기서 설정한 초기 값은 일반적으로 데이터 형식의 0 값을 가리킨다.
private static int a = 3;
이 변수 a는 준비 단계 후의 값이 0이고 변수 a에 3개의 값을 부여하는 것은 초기화 단계에서 발생한다.
3. 초기화 단계
초기화는 클래스 불러오는 메커니즘의 마지막 단계입니다. 클래스에 정의된 JAVA 프로그램 코드를 실행할 때입니다.앞에서 준비 단계에서 클래스 변수는 시스템이 요구하는 초기 값을 한 번 부여했다. 초기화 단계에서 가장 중요한 것은 클래스 변수를 초기화하는 것이다. 관심의 중점은 부자류 간의 각종 자원 초기화 순서이다.
자바 클래스에서 클래스 변수에 대한 초기 값을 지정하는 데는 두 가지 방법이 있다. 1. 클래스 변수를 설명할 때 초기 값을 지정한다.2. 정적 초기화 블록을 사용하여 클래스 변수의 초기 값을 지정합니다.
초기화 시기
1) 클래스 실례를 만들 때 다음과 같다. 1. new 키워드를 사용하여 실례를 만든다.2. 반사를 통해 실례를 생성한다.3. 반서열화 방식으로 실례를 만듭니다.

new Test();
Class.forName(“com.mengdd.Test”);
2) 어떤 종류의 클래스를 호출하는 방법(정적 방법)

Test.doSomething();
3) 클래스나 인터페이스의 클래스 변수에 접근하거나 클래스 변수에 값을 부여합니다. 

int b=Test.a;
Test.a=b;
4) 어떤 종류의 하위 클래스를 초기화합니다.애초에 자류를 시화시켰을 때, 이 자류의 모든 부류는 초기화될 것이다.
5) 자바를 직접 사용합니다.exe 명령으로 주 클래스를 실행합니다.
상기 몇 가지 방식을 제외하고 하나의 클래스를 자동으로 초기화할 수 있으며, 다른 접근 클래스의 방식은 모두 클래스의 초기화를 촉발하지 않을 것이며, 수동 인용이라고 부른다.
1. 하위 클래스는 상위 클래스의 정적 변수를 참조하여 하위 클래스를 초기화하지 않습니다.

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println("supclass init");
 }
}
public class SubClass extends SupClass
{
 static
 {
  System.out.println("subclass init");
 }
}
public class Test
{
 public static void main(String[] args)
 {
  System.out.println(SubClass.a);
 }
}
실행 결과:
supclass init
123
2. 그룹을 통해 인용 클래스를 정의하고 이런 초기화를 촉발하지 않습니다

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println("supclass init");
 }
}
public class Test
{
 public static void main(String[] args)
 {
  SupClass[] spc = new SupClass[10];
 }
}
실행 결과:
3. 상수를 인용할 때 이 종류의 초기화를 촉발하지 않는다

public class ConstClass
{
 public static final String A= "MIGU";
 static
 {
  System.out.println("ConstCLass init");
 }
}
public class TestMain
{
 public static void main(String[] args)
 {
  System.out.println(ConstClass.A);
 }
}
실행 결과:
MIGU
final로 어떤 클래스 변수를 수식할 때, 그 값은 컴파일할 때 상량 탱크에 넣기로 확정되었기 때문에, 이 클래스 변수에 접근할 때, 상량 탱크에서 직접 가져오는 것과 같고, 이 클래스를 초기화하지 않았습니다.
초기화하려면
1. 이 클래스가 아직 불러오고 연결되지 않으면 프로그램은 먼저 이 클래스를 불러오고 연결합니다.
2. 이 클래스의 직접 부류가 불러오지 않으면 직접 부류를 초기화합니다.
3. 클래스에 초기화 문장이 있으면 시스템은 순서대로 이 초기화 문장을 실행한다.
두 번째 단계에서 직접 부류에 직접 부류가 있으면 시스템은 이 세 가지 절차를 다시 반복하여 이 부류를 초기화합니다. 순서대로 유추하면 JVM이 가장 먼저 초기화하는 것은 항상java입니다.lang.Object 클래스.프로그램이 어떤 종류를 주동적으로 사용할 때, 시스템은 이 종류와 모든 부류가 초기화될 것을 보장할 것이다.
위에서 설명한 것은 여러분에게 소개된 JAVA 클래스 로드 메커니즘(추천)입니다. 여러분에게 도움이 되었으면 합니다!

좋은 웹페이지 즐겨찾기