类加载器应该首先将加载过程委托给它的父类加载器。这是一些文档所说的。
那么,如果我们不遵循这个模式会发生什么。那就是:
我们重写了loadClass,在它的实现中,我们直接调用:
defineClass(...) // get Class objet for a given byte array
resoveClass(...) // link class to vm
Tomcat 的 Web 应用程序类加载器是一个类加载器的示例,它不会(总是)首先将加载过程委托给其父级(根据 Servlet 规范)。 classloader-howto 文章解释了这一点,并深入了解了该做什么(不该做什么)。如果你想了解它在实际中是如何工作的,可以查看WebappClassLoader的源代码。
在侧节点上,如果当前线程是使用自定义类加载器启动的,则创建 URLClassLoader 而不将
Thread.currentThread().getContextClassLoader()
作为构造函数中的父类加载器传递可能会产生令人惊讶的结果。 URLClassLoader 只知道系统类加载器中的类和提供的 URL 中的类,但不知道自定义类加载器中的类。