자바 classLoader 메커니즘

34983 단어 ClassLoader
자바 에는 모두 네 개의 클래스 로 더 가 있 습 니 다. 클래스 로 더 라 는 이 유 는 프로그램 이 특정한 종 류 를 사용 할 때 클래스 로 더 를 불 러 와 야 합 니 다.    이 네 가지 종류의 로 더 는 각각 Bootstrap ClassLoader, Extension ClassLoader, AppClassLoader 와 URLClassLoader 로 그들의 역할 은 사실 이름 에서 대충 추측 할 수 있다.그 중에서 도 AppClassLoader 는 System ClassLoader Bootstrap ClassLoader 라 고 불 리 는 곳 이 많 습 니 다. ClassLoader 는 JVM 이 실 행 될 때 자바 의 핵심 클래스 를 불 러 옵 니 다. C + + 로 작 성 된 것 입 니 다. 핵심 라 이브 러 리 를 불 러 옵 니 다. JVM 소스 코드 에 서 는 static const char classpathFormat [] = "% / lib / rt. jar:"% / lib / i18n. jar: "% / lib / sunrsasign. jar:"% / lib / jsse. jar: "% / lib / jce. jar:""% / lib / charsets. jar:"% / classes "; Extension ClassLoader 는 확장 클래스, 즉 / lib / ext 의 클래스 를 불 러 오 는 데 사 용 됩 니 다. AppClassLoader 는 Classpath 를 불 러 오 는 클래스 로 우리 와 가장 밀접 한 관 계 를 가 진 클래스 입 니 다. URLClassLoader 는 네트워크 에서 원 격 클래스 를 불 러 오 는 데 사 용 됩 니 다. 잠시 토론 하지 않 습 니 다.

JVM(Java ) , :        bootstrap classloader                 |        extension classloader                 |        system classloader bootstrap classloader - ( ) , Java 。 Sun JVM , java -Xbootclasspath - D sun.boot.class.path 。 , java.lang.ClassLoader , JVM 。 bootstrap classloader :    URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();    for (int i = 0; i < urls.length; i++) {      System.out.println(urls.toExternalform());    } : :/C:/j2sdk1.4.1_01/jre/lib/endorsed/dom.jar :/C:/j2sdk1.4.1_01/jre/lib/endorsed/sax.jar :/C:/j2sdk1.4.1_01/jre/lib/endorsed/xalan-2.3.1.jar :/C:/j2sdk1.4.1_01/jre/lib/endorsed/xercesImpl-2.0.0.jar :/C:/j2sdk1.4.1_01/jre/lib/endorsed/xml-apis.jar :/C:/j2sdk1.4.1_01/jre/lib/endorsed/xsltc.jar :/C:/j2sdk1.4.1_01/jre/lib/rt.jar :/C:/j2sdk1.4.1_01/jre/lib/i18n.jar :/C:/j2sdk1.4.1_01/jre/lib/sunrsasign.jar :/C:/j2sdk1.4.1_01/jre/lib/jsse.jar :/C:/j2sdk1.4.1_01/jre/lib/jce.jar :/C:/j2sdk1.4.1_01/jre/lib/charsets.jar :/C:/j2sdk1.4.1_01/jre/classes CLASSPATH , JVM 。 extension classloader - , JRE (JAVA_HOME/jre/lib/ext java.ext.dirs ) JAR 。 Java 。 JRE JVM , JAR JVM system classloader 。 getParent() null, bootstrap classloader ClassLoader 。 :    System.out.println(System.getProperty("java.ext.dirs"));    ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();    System.out.println("the parent of extension classloader : "+extensionClassloader.getParent()); : C:\j2sdk1.4.1_01\jre\lib\ext the parent of extension classloader : null extension classloader system classloader parent, bootstrap classloader extension classloader parent, classloader, null。 system classloader - ( ) , JVM , java -classpath java.class.path CLASSPATH* JAR 。 ClassLoader.getSystemClassLoader() 。 , 。 :    System.out.println(System.getProperty("java.class.path")); CLASSPATH。 classloader 。 , classloader Class , Class Class classloader , classloader ; parent( ) ( super, parent classloader ) , parent 。 cache , cache Class , Class, cache, Class JVM 。 ClassLoader Class : 1. Class ( cache Class), 8, 2 2. parent classloader ( parent, parent bootstrap classloader ), 4 3. parent classloader , 8, 5 4. jvm bootstrap classloader , 8 5. Class ( classloader )。 7. 6. Class, 8. 7. ClassNotFoundException. 8. Class. 5.6 ClassLoader findClass 。 loadClass 。 : bootstrap classloader, extension classloader, system classloader。 Class 。 , system classloader“ ” “java.lang.System” 。 , , , bootstrap classloader 。 :    System.out.println(System.class.getClassLoader()); null, java.lang.System bootstrap classloader , bootstrap classloader ClassLoader , JVM , 。 JVM : sun.misc.Launcher, , java ,JVM bootstrap classloader Launcher, :   System.out.println("the Launcher's classloader is "+sun.misc.Launcher.getLauncher().getClass().getClassLoader()); :   the Launcher's classloader is null ( bootstrap classloader , class loader null) Launcher class loader ,JVM extension classloader system classloader, Class, java main Class。extension classloader sun.misc.Launcher$ExtClassLoader ,system classloader sun.misc.Launcher$AppClassLoader 。 java.net.URLClassLoader 。 Launcher 。 Launcher : Java

01. public class Launcher  {
02.    public Launcher() {
03.        ExtClassLoader extclassloader;
04.        try {
05.            // extension classloader
06.            extclassloader = ExtClassLoader.getExtClassLoader();
07.        } catch(IOException ioexception) {
08.            throw new InternalError("Could not create extension class loader");
09.        }
10.        try {
11.            // system classloader,parent extension classloader
12.            loader = AppClassLoader.getAppClassLoader(extclassloader);
13.        } catch(IOException ioexception1) {
14.            throw new InternalError("Could not create application class loader");
15.        }
16.        // system classloader context classloader( )
17.        Thread.currentThread().setContextClassLoader(loader);
18.        ......
19.    }
20.    public ClassLoader getClassLoader() {
21.        // system classloader
22.        return loader;
23.    }
24. }
25.   
26. extension classloader :
27. static class Launcher$ExtClassLoader extends URLClassLoader {
28.   
29.    public static Launcher$ExtClassLoader getExtClassLoader()
30.        throws IOException
31.    {
32.        File afile[] = getExtDirs();
33.        return (Launcher$ExtClassLoader)AccessController.doPrivileged(new Launcher$1(afile));
34.    }
35.   private static File[] getExtDirs() {
36.        // “java.ext.dirs”
37.        String s = System.getProperty("java.ext.dirs");
38.        File afile[];
39.        if(s != null) {
40.            StringTokenizer stringtokenizer = new StringTokenizer(s, File.pathSeparator);
41.            int i = stringtokenizer.countTokens();
42.            afile = new File;
43.            for(int j = 0; j < i; j++)
44.                afile[j] = new File(stringtokenizer.nextToken());
45.   
46.        } else {
47.            afile = new File[0];
48.        }
49.        return afile;
50.    }
51. }
52.   
53. system classloader :
54. static class Launcher$AppClassLoader extends URLClassLoader
55. {
56.   
57.    public static ClassLoader getAppClassLoader(ClassLoader classloader)
58.        throws IOException
59.    {
60.        // “java.class.path”
61.        String s = System.getProperty("java.class.path");
62.        File afile[] = s != null ? Launcher.access$200(s) : new File[0];
63.        return (Launcher$AppClassLoader)AccessController.doPrivileged(new Launcher$2(s, afile, classloader));
64.    }
65. }

,extension classloader “java.ext.dirs” , parent。system classloader “java.class.path” , parent classloader。Launcher extension classloader,system classloader, system classloader context classloader, system classloader JVM。    context classloader ? ? Thread , setContextClassLoader classloader context classloader, , getContextClassLoader context classloader, Class。 system classloader。 , “ ”classloader , classloader context classloader, context classloader classloader 기타 classloader, classloader Class, classloader 。 classpath , classloader , system classloader( jvm classpath ) class context classloader classloader class( , classloader ), web servlet . , classloader 일 하 다 , ? classloader cache Class , , classloader, loadclass , Class defineClass ; , new classloader , Class, cache( , )。 , , ,java.netURLClassLoader classloader! ! j2se1.4 API doc URLClassLoader : URLClassLoader(URL[] urls)          Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader. URLClassLoader(URL[] urls, ClassLoader parent)          Constructs a new URLClassLoader for the given URLs. URL[] urls ,parent classloader parent classloader, system classloader。 , Class , newInstance Object。 Object ? Object Class ? java , !javac “JAVA_HOME/lib/tools.jar” “com.sun.tools.javac.Main” compile :    public static int compile(String as[]);    public static int compile(String as[], PrintWriter printwriter); 0 , as javac , 。 : javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java as {"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c: \\Some.java"}, PrintWriter , printWriter 。 System.err。 Main JVM Launcher system classloader , , java Class system classloader , system classloader Class , “cannot resolve symbol” 。 , CLASSPATH Class java , CLASSPATH , “cannot resolve symbol” ! , Class , , CLASSPATH classloader Class, “java.lang.NoClassDefFoundError” , ? , Class JVM Launcher system classloader , , ,JVM system classloader Class , system classloader Class “java.lang.NoClassDefFoundError” 。 OK, ,java Class , Launcher system classloader , system classloader, JVM classloader system classloader, , , system classloader Class, Java , CLASSPATH Class。 ! , Class CLASSPATH , system classloader 。 classloader class Class( parent , system classloader CLASSPATH ), Object, Class, JVM Class( system classloader Class CLASSPATH ), CLASSPATH Class, CLASSPATH , ! , “java.lang.ClassCastException” 。 ? , , CLASSPATH classloader Class, JVM system classloader Class, classloader Class system classloader Class( )。 ? classloader Class classloader Class, Class , class 。 JVM Class , JVM classloader Class( class ) ! , Java system classloader , classloader Class 。 , Class, , ! 。 Class system classloader ! ? 。 classloader Class , Class, JVM Class, Class system classloader , , system classloader , classloader Class, , Class, , Class ( ) java JVM ,JVM system classloader Class, Class。 Class system classloader , class loader Class, 。 , , Class( Class) 。 system classloader Class, , Class classloader classloader Class 。 CLASSPATH , 。 ? Servlet ,web application server Servlet Class , Class , Servlet Class, Servlet init,doPost,doGet destroy , Servlet web- inf/lib web-inf/classes system classloader classloader( classloader) 。 。 applet,ejb , . , example 。 , classloader , Class, , URL, , CLASSPATH jar 。 API doc ClassLoader Class :         public URL getResource(String name)          , class ( , , )。                 '/' 。                 parent classloader , parent, classloader( bootstrap classloader) 。 , findResource(String) 。         public static URL getSystemResource(String name)                 。 system class loader 。 ClassLoader.getSystemClassLoader().getResource(name)。 :    System.out.println(ClassLoader.getSystemResource("java/lang/String.class")); :    jar: :/C:/j2sdk1.4.1_01/jre/lib/rt.jar!/java/lang/String.class String.class rt.jar java/lang 。 Class jar ( , ) class loader , , class loader !

papa 2009-06-02 00:18:33.0 http://www.faceye.com

,extension classloader “java.ext.dirs” , parent。system classloader “java.class.path” , parent classloader。Launcher extension classloader,system classloader, system classloader context classloader, system classloader JVM。    context classloader ? ? Thread , setContextClassLoader classloader context classloader, , getContextClassLoader context classloader, Class。 system classloader。 , “ ”classloader , classloader context classloader, context classloader classloader 기타 classloader, classloader Class, classloader 。 classpath , classloader , system classloader( jvm classpath ) class context classloader classloader class( , classloader ), web servlet . , classloader 일 하 다 , ? classloader cache Class , , classloader, loadclass , Class defineClass ; , new classloader , Class, cache( , )。 , , ,java.netURLClassLoader classloader! ! j2se1.4 API doc URLClassLoader : URLClassLoader(URL[] urls)          Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader. URLClassLoader(URL[] urls, ClassLoader parent)          Constructs a new URLClassLoader for the given URLs. URL[] urls ,parent classloader parent classloader, system classloader。 , Class , newInstance Object。 Object ? Object Class ? java , !javac “JAVA_HOME/lib/tools.jar” “com.sun.tools.javac.Main” compile :    public static int compile(String as[]);    public static int compile(String as[], PrintWriter printwriter); 0 , as javac , 。 : javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java as {"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c: \\Some.java"}, PrintWriter , printWriter 。 System.err。 Main JVM Launcher system classloader , , java Class system classloader , system classloader Class , “cannot resolve symbol” 。 , CLASSPATH Class java , CLASSPATH , “cannot resolve symbol” ! , Class , , CLASSPATH classloader Class, “java.lang.NoClassDefFoundError” , ? , Class JVM Launcher system classloader , , ,JVM system classloader Class , system classloader Class “java.lang.NoClassDefFoundError” 。 OK, ,java Class , Launcher system classloader , system classloader, JVM classloader system classloader, , , system classloader Class, Java , CLASSPATH Class。 ! , Class CLASSPATH , system classloader 。 classloader class Class( parent , system classloader CLASSPATH ), Object, Class, JVM Class( system classloader Class CLASSPATH ), CLASSPATH Class, CLASSPATH , ! , “java.lang.ClassCastException” 。 ? , , CLASSPATH classloader Class, JVM system classloader Class, classloader Class system classloader Class( )。 ? classloader Class classloader Class, Class , class 。 JVM Class , JVM classloader Class( class ) ! , Java system classloader , classloader Class 。 , Class, , ! 。 Class system classloader ! ? 。 classloader Class , Class, JVM Class, Class system classloader , , system classloader , classloader Class, , Class, , Class ( ) java JVM ,JVM system classloader Class, Class。 Class system classloader , class loader Class, 。 , , Class( Class) 。 system classloader Class, , Class classloader classloader Class 。 CLASSPATH , 。 ? Servlet ,web application server Servlet Class , Class , Servlet Class, Servlet init,doPost,doGet destroy , Servlet web- inf/lib web-inf/classes system classloader classloader( classloader) 。 。 applet,ejb , . , example 。 , classloader , Class, , URL, , CLASSPATH jar 。 API doc ClassLoader Class :         public URL getResource(String name)          , class ( , , )。                 '/' 。                 parent classloader , parent, classloader( bootstrap classloader) 。 , findResource(String) 。         public static URL getSystemResource(String name)                 。 system class loader 。 ClassLoader.getSystemClassLoader().getResource(name)。 :    System.out.println(ClassLoader.getSystemResource("java/lang/String.class")); :    jar: :/C:/j2sdk1.4.1_01/jre/lib/rt.jar!/java/lang/String.class String.class rt.jar java/lang 。 Class jar ( , ) class loader , , class loader !


이들 의 관계: 1. Parent - child, 순서대로 큰 것 부터 작은 것 까지. 단순 한 계승 관 계 는 아 닙 니 다. 2. ClassLoader 는 getParent 방법 이 있 지만, Ext ClassLoader 호출 후 null 을 얻 었 습 니 다. bootstrap 은 JVM 자체 이 므 로 사용자 가 볼 수 없습니다. 3. classloader 의 위탁 시스템: 등급 이 낮은 ClassLoader 가 어떤 종 류 를 불 러 올 때 먼저 Parent 에 추가 해 달라 고 요청 합 니 다.로 더 를 불 러 옵 니 다. Parent 는 Parent 를 다시 요청 합 니 다. 예 를 들 어 현재 Ext 를 불 러 옵 니 다. 위로 요청 합 니 다. 최대 Bootstrap 을 찾 지 못 하면 Boot 는 Ext 에 게 직접 찾 으 라 고 합 니 다. Ext 를 찾 지 못 하면 다음 단계 의 App 을 찾 지 못 하 게 합 니 다. 이때 ClassNotFoundException 4. 클래스 A 호출 클래스 B, B 는 클래스 의 로 더 를 불 러 오 라 고 요구 합 니 다. 즉, B 가 요구 합 니 다.A 의 로 더 를 불 러 와 B 를 불 러 옵 니 다. 문제 가 있 습 니 다. 만약 그들 이 함께 있다 면 괜 찮 습 니 다. 어떤 classloader 가 둘 다 불 러 올 것 입 니 다. 그러나 A 가 / lib / ext 폴 더 에 있 고 B 가 Classpath 에 있다 면? 과정 은 이 렇 습 니 다. 먼저 A 를 불 러 옵 니 다. 그러면 한 층 한 층 씩 Bootstrap Classloader 로 올 라 갑 니 다. boot 를 찾 지 못 해서 ext 가 직접 찾 았 습 니 다. 찾 았 습 니 다. 문제 없습니다.B 를 불 러 옵 니 다. A 가 B 를 호출 했 기 때문에 bootstrap 에서 찾 았 습 니 다. 찾 지 못 했 습 니 다. 그리고 A 의 ext classloader 가 찾 아 왔 지만 찾 지 못 했 습 니 다. 하지만 더 이상 호출 되 지 않 았 습 니 다. 그래서 ClassNotFoundException 을 보 냈 습 니 다. 그러나 현실 생활 에서 많은 응용 프로그램 이 있 습 니 다. 예 를 들 어 JDBC 핵심 방법 이 핵심 라 이브 러 리 에서 확장 라 이브 러 리 를 구동 하 는 것 은 반드시 두 곳 에 있어 야 합 니 다. 그러면 어떻게 해 야 합 니까?ontext ClassLoader 는 스 레 드 Thread 를 만 들 때 이 스 레 드 를 setContextClassLoader 방법 으로 이 스 레 드 의 context classloader 로 지정 할 수 있 습 니 다. 이 스 레 드 가 실 행 될 때 getContextClassLoader 방법 으로 이 context classloader 를 얻 으 면 우리 가 필요 로 하 는 Cla 를 불 러 올 수 있 습 니 다.ss. 기본 값 은 system classloader 입 니 다. 이 기능 을 이용 하면 깨 뜨 릴 수 있 습 니 다.classloader 의뢰 메커니즘 입 니 다. 부모 classloader 는 현재 스 레 드 의 context classloader 를 얻 을 수 있 습 니 다. 이 context classloader 는 하위 classloader 나 다른 classloader 일 수 있 습 니 다. 그러면 부모 classloader 는 필요 한 Class 를 얻 을 수 있 습 니 다. 이것 은 부모 classloader 에 만 요청 할 수 있 는 제한 을 깨 뜨 립 니 다. 이 메커니즘 은 우리 의 classpath 가실행 할 때 확인 되 고 맞 춤 형 classloader 로 불 러 올 때 system classloader (즉 jvm classpath 에서) 로 불 러 온 class 는 context classloader 를 통 해 맞 춤 형 classloader 를 얻 고 특정한 class (일반적으로 추상 류 와 인터페이스, 맞 춤 형 classloader 에서 이 루어 집 니 다) 를 불 러 올 수 있 습 니 다. 예 를 들 어 웹 응용 프로그램의 servlet 은 이러한 메커니즘 으로 불 러 옵 니 다.
 

좋은 웹페이지 즐겨찾기