在Java 文档中,我看到了这样的陈述:
但是我在哪里可以学习这个“查找算法”实际上是如何工作的,特别是在Android环境下。系统类加载器的资源查找算法用于查找资源。
Bootstrap CL
|
|
Extension CL
|
|
SystemClassLoader CL
|
|
Application Specific CL
Class clazz=ClassLoader.getSystemClassLoader().findClass("org.pack.ExtClass");
这将首先委托给它的父类,即Extension ClassLoader,然后再委托给它的父类,即Bootstrap CL。由于Bootstrap CL找不到该类,因此将返回null给Extension ClassLoader,然后Extension CL将在自己的路径中查找该类。由于它将在类路径中找到名为"org.pack.ExtClass"的类,因此它将加载、准备并将该类返回到SystemClassLoader,后者将将引用clazz
设置为返回的类对象。
因此,一般规则是ClassLoader始终首先委托给其父级,然后尝试在自己的路径中查找该类。
但是,有例外情况,其中最突出的是Tomcat等WebApp Classloaders,在这些WebAppClassLoader行为略有不同。我认为Tomcat目录中有一个bootstrap.jar,其中包含CL,它将首先加载类,仅在无法找到请求的类时才委托给其父级。
一些链接:
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
希望有所帮助。