gpt4 book ai didi

java - 类加载器委托(delegate)模型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:08 25 4
gpt4 key购买 nike

我有一个简单的自定义类加载器

class CustomLoader extends ClassLoader {
@Override
protected Class findClass(String name) throws ClassNotFoundException {
System.out.println("In the custom loader");
throw new ClassNotFoundException();
}
}

这是我尝试在其中使用加载程序的代码:

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());
}

结果很符合预期:

class java.awt.Color
null

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

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

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

如您所见,我们没有看到任何类转换异常,事实上我的重写方法甚至都没有被调用。这意味着引导加载程序发现它是 Color 类。

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

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

最佳答案

根据 ClassLoader API,默认委托(delegate)模型以这种方式工作

当请求查找类或资源时,ClassLoader 实例将在尝试查找类或资源本身之前将类或资源的搜索委托(delegate)给其父类加载器。

这个委托(delegate)模型是在 ClassLoader.loadClass 方法中实现的,要改变它你应该覆盖 loadClass 方法而不是 findClass

关于java - 类加载器委托(delegate)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18650297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com