gpt4 book ai didi

java - 为什么这个 URLClassLoader 有时有效有时无效?

转载 作者:行者123 更新时间:2023-12-01 21:26:56 26 4
gpt4 key购买 nike

我有一个相当复杂的 Java 软件,它必须动态加载一个类、创建一个对象并调用其方法之一。事实证明,在某些情况下,如果加载的类引用了另一个类,则会引发 NoClassDefFoundError(由 ClassNotFoundException 引起)。

假设我们有:

public interface Go {
void go();
}

假设要加载的类是:

package foo;
import static baz.Baz.BAZ;
public class Foo implements Go {
@Override
void go() {
...
something = BAZ;
...
}
}

哪里

package baz;
public class Baz {
public static final int BAZ = 111;
...
}

假设类是这样加载的:

try (final URLClassLoader loader = new URLClassLoader(new URL[] { url })) {
final Class<? extends Foo> clazz =
loader.loadClass("foo.Foo").asSubclass(Go.class);
this.obj = clazz.newInstance();
this.obj.go();
} catch ...

然后一切正常。假设您以其他方式做事:

try (final URLClassLoader loader = new URLClassLoader(new URL[] { url })) {
final Class<? extends Foo> clazz =
loader.loadClass("foo.Foo").asSubclass(Go.class);
this.obj = clazz.newInstance();
//we do not invoke go() now...
} catch ...

//later, in another method...
this.obj.go();

现在,调用 go() 会引发 NoClassDefFoundError,提示它无法加载 baz.Baz。当然url是一样的。当然,foo.Foobaz.Baz都在url指示的路径中。我能看到的唯一区别是调用 go() 方法的那一刻。

这里出了什么问题?

最佳答案

What is wrong here?

我认为问题是这样的:

try (final URLClassLoader loader = new URLClassLoader(new URL[] { url })) {

这将导致类加载器在退出 try block 时关闭。 close() 方法的 javadoc说:

Closes this URLClassLoader, so that it can no longer be used to load new classes or resources that are defined by this loader.

调用 go() 方法会触发 Go 类的类初始化,这就是导致 Baz 类被初始化的原因。已加载并初始化。如果后面的类加载发生在类加载器关闭之后,就会失败。

关于java - 为什么这个 URLClassLoader 有时有效有时无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38016147/

26 4 0
文章推荐: java - ORDER BY 中的 HQL 案例排序不正确
文章推荐: Java - Set removeAll(Set) 不执行其工作