>  기사  >  Java  >  Java 클래스 로더 및 클래스 리플렉션 사용 예

Java 클래스 로더 및 클래스 리플렉션 사용 예

高洛峰
高洛峰원래의
2017-01-13 09:22:331526검색

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 구조는 다음과 같습니다.

Java 클래스 로더 및 클래스 리플렉션 사용 예

그중 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 중국어 웹사이트를 참고하세요. !

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.