2011-03-17 73 views
3

在Java docs我看到这样的语句:系统类加载器的资源查找算法

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

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

回答

2

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

你将不得不看看它的源代码来找出算法。这可能是遍历可用Jar文件和目录的某种形式的树遍历。

6

你在Java类加载器的层次结构,例如:

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

当调用一个CL的的findClass()方法一个ClassLoader通常委托给它的父首先将尝试加载类。

E.g.如果你想加载类,这是在EXT-文件夹JVM的你可以使用

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

首先会委托给它的父,扩展类加载器,这将委托给它的父, Bootstrap CL。 Bootstrap CL将返回null给扩展类加载器,因为它找不到该类,那么扩展CL将自己寻找类。由于它会在类路径中找到类“org.pack.ExtClass”,它将加载,准备并将类返回给SystemClassLoader,SystemClassLoader会将参考clazz设置为返回的类对象。

因此,作为一般规则,ClassLoader将总是首先委托给它的父代,并尝试自行寻找它的类。

但是这个规则有例外,最突出的是Tomcat等人的WebApp Classloaders。 WebAppClassLoader的行为有点不同。我认为Tomcat Directory中有一个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/

希望帮助..