【发布时间】:2014-10-05 19:43:01
【问题描述】:
我有一个自定义 URLClassLoader,它从正常类路径之外的 jar 文件加载几个类。到目前为止,一切顺利。
我的问题是,当我需要由我的 ClassLoader 加载的类时,我不能每次都调用这个 ClassLoader,因为这些类可能被第三方库使用。出于这个原因,我通过反射将类添加到当前的 Thread ClassLoader:
ProtectionDomain pd = getClass().getProtectionDomain();
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final java.lang.reflect.Method clM = ClassLoader.class.getDeclaredMethod("defineClass", Class.class);
clM.invoke(classLoader, className, byteContent, 0, byteContent.length, pd);
但是当调用该线程类加载器中的 findClass 并且我还没有添加所请求的类时,我得到了 NoClassDefFoundException。当然。
我现在的问题是,有没有办法将我的 ClassLoader 放入我的应用程序的全局类加载链中?无法为系统 ClassLoader 使用 Java 选项,因为我的 ClassLoader 可以包含在 Web 应用程序中并部署为 war 文件。我也尝试过使用Thread.currentThread().setContextClassLoader(),但是一旦创建了一个新线程,它当然没有我的 ClassLoader 设置。
我在网上搜索了几天,但找不到任何解决方案。
感谢您的帮助和任何建议。
最好的问候, 格里
【问题讨论】:
-
您可以将自定义类加载器的父类加载器设置为系统类加载器。这将使它成为类加载器层次结构的一部分。我已经实现了类似的东西;但我不确定你是否准确地解释了你的问题
标签: java multithreading classloader