자바 classLoader 메커니즘
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 은 이러한 메커니즘 으로 불 러 옵 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바, jar 패키지 에서 자원 파일 읽 기리 소스 Jar. jar 의 리 소스 클래스 를 호출 할 때 JVM 은 리 소스 클래스 에 불 러 오고 리 소스 가 실 행 될 때의 정 보 를 기록 합 니 다 (리 소스 가 있 는 jar 패키지 의 경로 정보 포함)...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.