首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Classloader委托模型

Classloader委托模型
EN

Stack Overflow用户
提问于 2013-09-06 13:08:51
回答 1查看 140关注 0票数 3

我有一个简单的自定义ClassLoader

代码语言:javascript
复制
class CustomLoader extends ClassLoader {
    @Override
    protected Class findClass(String name) throws ClassNotFoundException {
        System.out.println("In the custom loader");
        throw new ClassNotFoundException();
    }
}

下面是我尝试在其中使用加载器的代码:

代码语言:javascript
复制
public static void main(String... str) throws ClassNotFoundException {
        CustomLoader loader = new CustomLoader();
        Class<?> cls = loader.loadClass("java.awt.Color");

        System.out.println(cls);
        System.out.println(cls.getClassLoader());
}

结果是意料之中的:

代码语言:javascript
复制
class java.awt.Color
null

在大多数文章中,您可以看到,当您在自定义加载器上调用loadClass时,它首先会尝试在其缓存中查找类。如果找不到,它会从父加载器(在本例中为Application loader)调用loadClass方法。引导加载程序也是如此。之后,如果bootstrap装载器在其缓存中找不到类,它会尝试在各自的源代码中找到它。如果加载器找不到它,子加载器会尝试查找,依此类推到自定义加载器。

如果您查看类加载器实现,您将看到它只是调用findClass方法。但是考虑到我使用的是自定义加载器,并且java具有多态性,那么只要父加载器调用findClass,它们就会调用我的方法,对吧?

同时,据说java不会一次加载所有的类,而且只有在必要的时候才会加载。

正如你所看到的,我们没有看到任何类类型转换异常,事实上我的重写方法甚至没有被调用。这意味着引导加载程序找到了Color类。

问题是我的错误在哪里?如果java没有从java加载所有的类...包当jvm启动时,它不会在缓存中找到类Color,它会调用我的重写方法。

(在代码中的任何其他地方都没有使用类Color )

EN

回答 1

Stack Overflow用户

发布于 2013-09-06 13:16:48

根据ClassLoader API,默认的委托模型是这样工作的。

当被请求查找类或资源时,ClassLoader实例将把对类或资源的搜索委托给它的父类加载器,然后再尝试查找类或资源本身。

此委托模型是在ClassLoader.loadClass方法中实现的,若要更改它,应覆盖loadClass方法而不是findClass

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18650297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档