1. 하나의 명령은 하나의 프로세스에 해당합니다.
자바 프로그램을 시작하면, 즉 메인 메소드를 시작하면 아무리 복잡한 프로세스라도 자바 가상 머신 프로세스가 시작됩니다. 서로 다른 JVM 프로세스는 서로 영향을 미치지 않습니다. 이것이 Java 프로그램에 단 하나의 입구, 즉 가상 머신이 호출하는 메인 메소드만 있다고 말하는 이유입니다. 두 가지 주요 메소드는 두 개의 서로 다른 클래스 로더를 시작하고 실제로 서로 다른 클래스를 작동하는 두 개의 JVM 프로세스에 해당합니다. 따라서 서로 영향을 미치지 않습니다.
2. 수업 로딩.
클래스를 사용할 때 클래스가 메모리에 로드되지 않은 경우 시스템은 로드, 연결, 초기화를 통해 클래스를 초기화합니다.
1. 클래스 로딩: 클래스의 클래스 파일을 JVM으로 읽어 들여 클래스 객체를 생성하는 것을 말합니다.
2. 클래스 연결: 클래스의 바이너리 데이터를 JRE에 병합하는 것을 말하며 다음 세 단계로 나뉩니다.
a) 확인: 로드된 클래스 파일 데이터가 올바른지 확인합니다.
b) 준비: 클래스의 정적 변수에 저장 공간을 할당하고 기본 초기화를 수행합니다.
c), 구문 분석: 클래스의 바이너리 데이터에 있는 기호 참조를 직접 참조로 바꿉니다.
3. 초기화: 클래스의 정적 변수 및 정적 초기화 블록을 초기화합니다.
(참고: 최종 유형 정적 속성의 경우 속성 값을 컴파일 타임에 얻은 경우 속성을 호출해도 클래스가 초기화되지 않습니다. 이는 상수를 사용하는 것과 동일하기 때문입니다.
클래스를 로드만 하고 초기화하지 않는 ClassLoader() 메서드를 사용하세요. )
3.
클래스 로더는 .class 파일을 메모리에 로드하고 해당 java.lang.Class 객체를 생성하는 역할을 합니다. 클래스가 JVM에 로드되면 로드되지 않습니다. 다시.
Java에서 클래스는 정규화된 클래스 이름(예: 패키지 이름 + 클래스 이름)으로 식별됩니다.
JVM에서 클래스는 정규화된 클래스 이름과 클래스 로더로 식별됩니다.
JVM은 실행 시 3개의 ClassLoader, 즉 BootstrapClassLoader(루트 클래스 로더), ExtClassLoader(확장 클래스 로더) 및 AppClassLoader(시스템 클래스 로더)를 생성합니다. UML 구조는 다음과 같습니다.
그중 BootstrapClassLoader는 JRE의 핵심 클래스 라이브러리를 로드하는 역할을 담당합니다. ClassLoader의 하위 클래스는 아닙니다. C++로 작성되었으므로 Java에서는 표시되지 않으며 하위 클래스의 getParent() 메서드를 통해 얻을 때 null을 반환합니다. BootstrapClassLoader는 JRE 대상 아래에 rt.jar 및 charsets.jar과 같은 Java 핵심 클래스 라이브러리를 로드하는 역할을 합니다.
그림에서 볼 수 있듯이 ExtClassLoader와 AppClassLoader는 ClassLoader의 하위 클래스입니다. API에서는 볼 수 없으며 rt.jar 파일에 있습니다. 정규화된 클래스 이름은
sun.misc.Launcher$ExtClassLoader 및 sun.misc.Launcher$AppClassLoader입니다.
그 중 ExtClassLoader는 JRE 확장에서 JAR 패키지를 로드하는 역할을 담당합니다. 디렉토리 ext 및 AppClassLoader 클래스 경로 경로 아래에 클래스 패키지를 로드하는 역할을 담당합니다.
테스트 내용은 다음과 같습니다.
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
더 많은 Java 클래스 로더 및 클래스 리플렉션 사용 예제 관련 기사를 보려면 PHP 중국어 웹사이트를 참고하세요. !