자바 클래스 로 더-bootstrap,ExtClassLoader,AppClassLoader 의 관계

3176 단어 jvm
과거 에는 항상 보 는 것 을 좋아 했 지만 실험 을 별로 하지 않 았 거나 실험 을 하면 그대로 두 었 고 기록 도 하지 않 았 다.결 과 는 보고 잊 고 보 는 것 을 잊 었 다.이번 에는《자바 깊이 체험 》을 다시 읽 겠 습 니 다.웹 개발 내막-핵심 기초',마침 언급 한 김 에 기록 해 보 세 요.
 
 
1.간단 한 소개
 
  • Bootstrap、 ExtClassLoader、  AppClassLoader 는 자바 의 가장 뿌리 가 붉 은 클래스 로 더 입 니 다
  • Bootstrap 은 로 컬 코드 로 작 성 된 것 입 니 다(예 를 들 어 C). ExtClassLoader、  AppClassLoader 는 자바 코드 이 고 모두 rt.jar 에 있 으 며 공교롭게도 sun.misc.Launcher 내부 클래스 입 니 다

  • 부 트 스 트랩 은 할아버지,엑스 트 클래스 로 더 는 아빠,앱 클래스 로 더 는 아이(손자)다.그러나 아빠 ExtClassLoader 가 너무 바 빠 서 아 이 를 돌 보 는 AppClassLoader 의 책임 은 할아버지 Bootstrap 에 의 해 처리 된다(즉,ExtClassLoader 는 AppClassLoader 아빠 이지 만 할아버지 Bootstrap 에 의 해 로드 된 AppClassLoader 이다.이 상황 은 중국의 국정 과 완전히 같다
    2.코드 실험
     
    public class LoaderTest {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    		new LoaderTest().test();
    
    	}
    
    	/**
    	 * @param args
    	 */
    	public void test() {
    		ClassLoader fatherLoader = this.getClass().getClassLoader();
    		System.out.println("          :" + fatherLoader.getClass().getName());
    
    		//     AppClassLoader        ExtClassLoader,    Bootstrap
    		//    (    .getClassLoader()   null)
    		// Bootstrap、 ExtClassLoader、  AppClassLoader          ,      :ExtClassLoader AppClassLoader   ,  AppClassLoader     Bootstrap         。
    		System.out.println("AppClassLoader       null :"
    				+ (fatherLoader.getClass().getClassLoader() == null));
    
    	 
    
    		ClassLoader grandfatherLoader = fatherLoader.getParent();
    		System.out.println("      :" + grandfatherLoader.getClass().getName());
    
    	}
    
    }
    
     
       코드 실행 결과:
     
    현재 클래스 의 부모 로 더 이름:sun.misc.Launcher$AppClassLoader
    AppClassLoader 의 로 더 는 null 입 니까?true
    할아버지 캐리어 이름:sun.misc.Launcher$ExtClassLoader
     
     
    3.클래스 로 더 가 각각 검색 한 디 렉 터 리
    1.Bootstrap Loader(시작 클래스 로 더):System.getProperty("sun.boot.class.path")가 지정 한 경로 나 jar 를 불 러 옵 니 다.System.out.println(System.getProperty("sun.boot.class.path")을 통 해인쇄,발견 은 주로"D:\Program Files\\Java\\jdk 1.6.0"10\jre\lib"의 jar 패키지 입 니 다.
    2.Extended Loader(표준 확장 클래스 로 더 ExtClassLoader):System.getProperty("java.ext.dirs")가 지정 한 경로 나 jar 를 불 러 옵 니 다.자바 실행 프로그램 을 사용 할 때 검색 경 로 를 지정 할 수 있 습 니 다.예 를 들 어 자바-Djava.ext.dirs=d:\procjects\testproj\classes HelloWorld.
    System.out.println(System.getProperty("java.ext.dirs")인쇄 를 통 해,주요 로 딩 디 렉 터 리 는 다음 과 같 습 니 다:
    “D:\Program Files\Java\jdk1.6.0_10\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext”
    3.AppClass Loader(시스템 클래스 로 더 AppClassLoader):System.getProperty("java.class.path")가 지정 한 경로 나 jar 를 불 러 옵 니 다.자바 실행 프로그램 을 사용 할 때 도-cp 를 추가 하여 기 존의 Classpath 설정 을 덮어 쓸 수 있 습 니 다.예 를 들 어 자바-cp./lavasoft/classes HelloWorld
    eclipse 에 대해 서 는'classpath'의 jar 가방 입 니 다.
     
    ExtClassLoader 와 AppClassLoader 는 JVM 이 시 작 된 후 JVM 에 한 부 를 저장 하고 프로그램 실행 중 검색 경 로 를 변경 할 수 없습니다.실행 할 때 다른 검색 경로 에서 클래스 를 불 러 오 려 면 새로운 클래스 로 더 를 만들어 야 합 니 다.
    PS:이 단락 은 lavasoft 에서 따 왔 습 니 다.주 소 는 다음 과 같 습 니 다.
     
     
    참고:
    http://hi.baidu.com/haifengjava/blog/item/498fd8365ef5c8390a55a9db.html
    http://lavasoft.blog.51cto.com/62575/184547
    …………

    좋은 웹페이지 즐겨찾기