class 加载器是否有可能让 classes 已经被不同的 class 加载器加载?

Is it possible for class loader to get classes already loaded by different class loader?

我有 class Foo 需要 class Bar 作为导入。 Class Bar 使用与 Foo 不同的 class 加载器加载,并且在定义 Foo 时,class 加载器找不到 Bar并抛出 ClassNotFoundException。如果 class 在当前的 class 加载程序中不可用,是否可以告诉 class 加载程序尝试寻找另一个?

一般不会,不会。可以编写这样一个 classloader,但你不能 'edit' 现有的 classloader 像这样工作。

ClassLoaders 由任一代码本身询问(SomeClass.class.getResource 将在那里结束,当然,在实际 [=13= 上调用 findResourceloadClass 或诸如此类的东西] 实例),或者由 JVM(当给定的 class 需要另一个执行时,class 的 classloader 被请求。这通常会导致 CL return从缓存中获取它,但如果它尚未被该 CL 加载,则会导致它被加载)。

然后 CL 可以自由地以任何它认为合适的方式实现这个请求。 URLClassLoader,也是默认的 classloader(使用 classpath 初始化)将首先询问其父加载器(在默认的 JVM 配置中,这将是知道位置的系统加载器,例如 java.lang.String 存在,来自 JDK 安装的 jmod 文件)和 return 结果(如果可用)。然后它将通过扫描 classpath 加载,并在那里结束。您不能要求现有的 URLClassLoader 更改其行为,但您当然可以编写自己的 classloader - 它只是代码,您可以扩展 findClass 等方法。

也许可以详细说明您要完成的任务。为什么涉及多个 classloader?你想通过多个加载器来完成什么? (比如说:从数据库 BLOB 字段加载 classes,或者,将模块分离出来,或者,允许动态重新加载 Web 处理程序 - 那种答案)。 您是否正在使用现有的基于 CL 的框架,例如 OSGi?