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

时间:2011-03-17 12:43:45

标签: java android

在Java docs中,我看到了这样的陈述:

  

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

但我在哪里可以了解这种“查找算法”是如何实际运作的,尤其是在Android环境中。

2 个答案:

答案 0 :(得分:6)

您在java中有类加载器的层次结构,例如:

    Bootstrap CL
        |
        |
    Extension CL
        |
        |
SystemClassLoader CL
        |
        |    
Application Specific CL

当调用CL的findClass()方法时,ClassLoader通常首先委托它的父级,它将尝试加载Class。

E.g。如果您正在尝试加载JVM的 ext-folder 中的类,则可以使用

Class clazz=ClassLoader.getSystemClassLoader().findClass("org.pack.ExtClass");

这将首先委托它的父,Extension ClassLoader,它将委托给它的父亲Bootstrap CL。 Bootstrap CL将返回null到Extension ClassLoader,因为它找不到类,然后Extension CL将自己查找Class。因为它会在类路径中找到类“org.pack.ExtClass”,它将加载,准备并将类返回给SystemClassLoader,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/

希望有所帮助..

答案 1 :(得分:2)

在Android(Dalvik)系统中,类加载器为PathClassLoader

您必须查看其源代码以找出算法。它将是可用Jar文件和目录的某种形式的树遍历。