2013-06-21 116 views
1

我有多个编译的Java类文件,来自目录中的各种软件包,就像这样。Java URLClassloder挂起

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”运行良好。该程序永久挂起。

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

因此,这里是我的问题:

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

问题有解决吗?

谢谢您的时间。

+0

快速'jstack'或^ Z/^中断应显示挂起的位置。 –

+0

我已经知道挂起发生的位置,并发现扩展本机类和挂起之间的关联;有没有关于这方面的任何文件? – Terra

+0

我的意思是在执行的地方。 –

回答

1

URLClassLoader需要它知道如何加载JDK类父。父装载机应该可以从上下文中借用,即:

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

参见URLClassLoader(URL[], ClassLoader)

+0

非常感谢。 :) – Terra