繁体   English   中英

class 加载器是否可以获取已由不同 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 加载程序尝试寻找另一个?

一般不会,不会。 可以编写这样的类加载器,但您不能“编辑”现有的类加载器来像这样工作。

ClassLoaders are asked by either code itself ( SomeClass.class.getResource will end up there, as will, of course, invoking findResource or loadClass or whatnot on an actual ClassLoader instance), or by the JVM (when a given class needs another to execute , 类的类加载器被要求加载它。这通常会导致 CL 从缓存中返回它,但如果它还没有被那个 CL 加载,那将导致它被加载)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM