【问题标题】:Java URLClassloder HangingJava URLClassloder 挂起
【发布时间】:2013-06-21 15:50:30
【问题描述】:

我在一个目录中有多个从各种包中编译的 Java 类文件,就像这样。

C:/classes/package/A.class

C:/classes/package/B.class

C:/classes/package/subpackage/C.class

C:/classes/package/subpackage/D.class

我正在尝试使用这样的 URLClassloader 加载它们。

URLClassloder classloader = new URLClassLoader(new URL[]{new File("C:/classes/").toURI().toURL()});
System.out.println("Loading classes...");
classloader.loadClass("package.A");
classloader.loadClass("package.B");
classloader.loadClass("package.subpackage.C");
classloader.loadClass("package.subpackage.D");
System.out.println("Loaded classes.");

此代码运行良好,直到我尝试加载“package.subpackage.D”。程序永久挂起。

更改加载类的顺序没有任何效果,但经过大量实验后,我发现任何扩展本机类的类都会导致这种挂起,“本机”指的是运行时中已经存在的所有类。

所以这是我的问题:

这是在运行时加载类的正确方法吗?

问题有解决办法吗?

感谢您的宝贵时间。

【问题讨论】:

  • 快速 jstack 或 ^Z/^break 应该会显示挂起的位置。
  • 我已经知道挂起发生在哪里,并且发现了扩展原生类和挂起之间的关联;有这方面的文件吗?
  • 我的意思是在哪里实现。

标签: java dynamic runtime urlclassloader


【解决方案1】:

您的URLClassLoader 需要一个知道如何加载 JDK 类的父级。父加载器可能应该从上下文中借用,即:

new URLClassLoader(urls, this.getClass().getClassLoader()) 

URLClassLoader(URL[], ClassLoader)

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2017-09-16
    • 2014-11-01
    • 1970-01-01
    • 2017-10-31
    • 2013-10-19
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多