系统类加载器的资源查找算法

3
在Java 文档中,我看到了这样的陈述:

系统类加载器的资源查找算法用于查找资源。

但是我在哪里可以学习这个“查找算法”实际上是如何工作的,特别是在Android环境下。
2个回答

6
在Java中,您有一个类加载器的层次结构,例如:
    Bootstrap CL
        |
        |
    Extension CL
        |
        |
SystemClassLoader CL
        |
        |    
Application Specific CL

当调用CL的findClass()方法时,ClassLoader通常首先委派给其父级来尝试加载类。
例如,如果您尝试加载位于JVM的ext文件夹中的类,则可以使用。
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

http://www.ibm.com/developerworks/java/library/j-dyn0429/

希望有所帮助。

2
在Android(Dalvik)系统中,类加载器是PathClassLoader
您将不得不查看其源代码以找出算法。这将是跨可用Jar文件和目录进行某种形式的树遍历。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接