ClassLoader应首先将加载过程委托给它的父级。这是一些文档说的。
那么,如果我们不遵循这种模式会发生什么。那就是:
我们覆盖loadClass,在它的实现中,我们直接调用:
defineClass(...) // get Class objet for a given byte array
resoveClass(...) // link class to vm
答案 0 :(得分:1)
Tomcat的Web应用程序类加载器是一个类加载器的示例,它不会(始终)将加载过程首先委托给其父进程(根据Servlet规范)。 classloader-howto文章解释了这一点,并提供了(不)要做的事情的见解。如果您想知道它在实践中的工作原理,您可以查看WebappClassLoader的源代码。
在侧节点上,如果当前线程是使用自定义类加载器启动的,那么在构造函数中创建URLClassLoader而不传递Thread.currentThread().getContextClassLoader()
作为父类加载器可能会产生令人惊讶的结果。 URLClassLoader只知道System Classloader中的类和提供的URL中的类,而不知道自定义类加载器中的类。