你有一个java类加载器的层次结构,例如:
Bootstrap CL
|
|
Extension CL
|
|
SystemClassLoader CL
|
|
Application Specific CL
Run Code Online (Sandbox Code Playgroud)
在调用CL的findClass()方法时,ClassLoader通常会先委托给它的父级,然后尝试加载Class.
例如,如果您正在尝试加载可以使用的JVM 的ext文件夹中的类
Class clazz=ClassLoader.getSystemClassLoader().findClass("org.pack.ExtClass");
Run Code Online (Sandbox Code Playgroud)
这将首先委托给它的父类Extension ClassLoader,它将委托给它的父代Bootstrap CL.Bootstrap CL将返回null到Extension ClassLoader,因为它找不到类,然后Extension CL将自己查找Class.因为它会在类路径中找到类"org.pack.ExtClass",它将加载,准备并将类返回给SystemClassLoader,后者将设置clazz对返回的类对象的引用.
因此,作为一般规则,ClassLoader将始终首先委托给它的父级,并尝试自己查找该类.
但是这个规则有例外,最突出的是Tomcat等人的WebApp类加载器.WebAppClassLoader的行为略有不同.我认为在Tomcat目录中有一个带有CL的bootstrap.jar,它将首先加载类,如果找不到请求的类,则只委托给它的父类.
一些链接:
http://www.developer.com/java/other/article.php/2248831/Java-Class-Loading-The-Basics.htm
http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html
http://www.ibm.com/developerworks/java/library/j-dyn0429/
希望有帮助..
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |