答案 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文件和目录的某种形式的树遍历。