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

标签 java android

Java docs我看到这样的说法:

The system class loader's resource lookup algorithm is used to find the resource.

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

最佳答案

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

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

当调用 CL 的 findClass() 方法时,ClassLoader 通常首先委托(delegate)给它的父类,后者将尝试加载类。

例如如果您尝试加载位于 JVM 的 ext-folder 中的类,您可以使用

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

这将首先委托(delegate)给它的父类,扩展类加载器,它会委托(delegate)给它的父类,Bootstrap CL。 Bootstrap CL 将 null 返回给 Extension ClassLoader,因为它找不到该类,然后 Extension CL 将自行查找该类。由于它将在类路径中找到类“org.pack.ExtClass”,因此它将加载、准备并将该类返回给 SystemClassLoader,这会将引用 clazz 设置为返回的类对象。

因此作为一般规则,ClassLoader 总是首先委托(delegate)给它的父类,然后尝试自己找到类。

但是这条规则也有异常(exception),最突出的是 Tomcat 等的 WebApp 类加载器。 WebAppClassLoader 的行为略有不同。我认为 Tomcat 目录中有一个带有 CL 的 bootstrap.jar,它将首先加载类,并且仅在找不到请求的类时才委托(delegate)给它的父级。

一些链接:

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/

希望对您有所帮助..

关于java - 系统类加载器的资源查找算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339147/

相关文章:

android - 在 Android 和 Node.js 之间传输大文件

java - Android 在右下角显示警报对话框,并在显示时使用 Activity

java - 在准备语句中使用 where 子句的 SQL 查询

java - 对 map 中的对象进行分组

java - 调用自定义适配器时出现空点异常 : Android

java - Android - 通过ScrollView的一部分传递触摸事件

java - 使用 Guava Joiner 连接数组并包装每个元素

java - 使用 RequestParam 上传文件

java - 如何修复任务 ':app:lintVitalRelease'的执行失败

android - 如何使 EditText 框高度扩大