JAVA Launcher 간략 분석

3937 단어 jdk
JAVA Launcher 간략 분석
sun. misc. Launcher 류 는 자바 의 입구 입 니 다. 자바 애플 리 케 이 션 을 시작 할 때 먼저 Launcher 류 를 만 들 고 Launcher 류 를 만 들 때 프로그램 실행 에 필요 한 클래스 로 더 를 준비 합 니 다.
1. ClassLoader
Launcher 는 JAVA 애플 리 케 이 션 의 입구 로 서 부모 위임 모델 에 따라 Laucher 는 JVM 에서 만 들 어 졌 습 니 다. 클래스 로 더 는 BootStrapClassLoader 여야 합 니 다. 이것 은 C++ 로 작 성 된 클래스 로 자바 응용 시스템 의 최상 위 클래스 로 더 입 니 다. JVM 을 불 러 오 는 데 필요 한 클래스 라 이브 러 리 (/lib) 를 책임 집 니 다.간단 한 코드 를 통 해 우리 의 생각 을 검증 할 수 있다.
public class App {
    public static void main(String[] args) {
        ClassLoader classLoader = Launcher.class.getClassLoader();
    }
}

이곳 의 classLoader 는 null 입 니 다. Launcher 가 확실히 BootstrapClassLoader 로 불 러 온 것 임 을 설명 합 니 다. 그러면 우 리 는 ExtClassLoader 가 언제 만 들 어 졌 는 지 매우 궁금 할 것 입 니 다.Launcher 의 구조 기 코드 를 뒤 져 보 세 요.
    public Launcher() {
        sun.misc.Launcher.ExtClassLoader extClassLoader;
        try {
            extClassLoader = sun.misc.Launcher.ExtClassLoader.getExtClassLoader();
        } catch (IOException var10) {
            throw new InternalError("Could not create extension class loader", var10);
        }
        try {
            this.loader = sun.misc.Launcher.AppClassLoader.getAppClassLoader(extClassLoader);
        } catch (IOException var9) {
            throw new InternalError("Could not create application class loader", var9);
        }

        Thread.currentThread().setContextClassLoader(this.loader);
    }

Launcher 를 만 들 때 첫 번 째 일 은 ExtClassLoader 를 가 져 오 는 것 입 니 다. ExtClassLoader 는 JVM 에서 하나의 예 입 니 다. 생 성 과정 도 환경 변 수 를 가 져 와 ext 로 딩 된 디 렉 터 리 를 가 져 오고 ExtClassLoader 를 만 듭 니 다. ExtClassLoader 는 URLClassLoader 의 하위 클래스 입 니 다.
       public static Launcher.ExtClassLoader getExtClassLoader() throws IOException {
            if (instance == null) {
                Class clazz = Launcher.ExtClassLoader.class;
                synchronized(Launcher.ExtClassLoader.class) {
                    if (instance == null) {
                        instance = createExtClassLoader();
                    }
                }
            }
            return instance;
        }

ExtClassLoader 를 가 져 온 후 부모 클래스 로 sun. misc. Launcher. AppClassLoader 를 만 듭 니 다. AppClassLoader 의 로 딩 경 로 는 java. class. path 에 표 시 된 경로 입 니 다. 마찬가지 로 AppClassLoader 도 URLClassLoader 의 하위 클래스 입 니 다.최종 적 으로 현재 스 레 드 의 컨 텍스트 클래스 로 더 를 AppClassLoader 로 설정 합 니 다.상기 분석 을 통 해 현재 프로그램의 AppClassLoader 나 ExtClassLoader 를 가 져 와 야 할 때 Launcher 를 사용 하여 직접 접근 할 수 있 습 니 다.
public class App {
    public static void main(String[] args) {
        ClassLoader appClassLoader = Launcher.getLauncher().getClassLoader();
        ClassLoader extClassLoader = appClassLoader.getParent();
    }
}

2. Thread 컨 텍스트 ClassLoader 의 사고
자바 프로그램 은 단독 실행 가능 한 파일 이 아니 라. class 파일 로 구성 되 어 있 습 니 다.프로그램 이 시 작 될 때 모든 클래스 가 불 러 오 는 것 은 아 닙 니 다. 한 클래스 가 불 러 올 때 이 클래스 를 참조 하 는 로 더 를 사용 합 니 다. 즉, xxx. class. getClassLoader () 입 니 다.그러나 일상적으로 사용 할 때, 또 하 나 는 Thread 의 상한 문 을 통 해 클래스 캐리어 를 가 져 오 는 것 이다.자바 에 서 는 왜 문맥 류 로 더 가 필요 합 니까? 이것 이 바로 매우 재 미 있 는 문제 입 니 다.우 리 는 자바 류 에 불 러 온 부모 위임 모델 을 알 고 있 습 니 다. 한 종 류 를 불 러 올 때 부모 클래스 에 우선 위임 합 니 다. 이렇게 하면 클래스 가 중복 불 러 오지 않 고 자바 의 일부 기본 클래스 가 안정 적 으로 존재 할 수 있 으 며 사용자 정의 클래스 에 의 해 대체 되 지 않도록 보장 합 니 다.부모 위임 모델 은 완벽 하지 않 습 니 다. 일부 장면 에서 해결 하기 어 려 운 문제 가 발생 할 수 있 습 니 다. 예 를 들 어 SPI 를 사용 할 때 ServiceLoader 는 BootStrap 류 로 더 를 통 해 불 러 옵 니 다. 사용자 가 작성 한 확장 클래스 를 불 러 올 때 현재 클래스 로 더 를 사용 하면 사용자 가 작성 한 클래스 에 불 러 올 수 없습니다.이 때 는 더 이상 실행 할 수 없습니다. 따라서 이 때 는 Thread 의 컨 텍스트 클래스 로 더 를 사용 해 야 합 니 다. 원본 코드 를 볼 때 사용자 가 ClassLoader 를 주동 적 으로 전달 하지 않 을 때 현재 컨 텍스트 클래스 로 더 를 가 져 와 야 프로그램 이 정상적으로 실 행 될 수 있 습 니 다.
    public static  ServiceLoader load(Class service) {
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        return ServiceLoader.load(service, cl);
    }

좋은 웹페이지 즐겨찾기