gpt4 book ai didi

java - 在运行时替换(覆盖)类实现 (Java)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:37 26 4
gpt4 key购买 nike

是否有任何方法可以替换(覆盖)Java 类实现,该实现已经由系统类加载器加载到另一个实现(以字节数组形式提供)?

为了说明我的疑问,请遵循以下代码:

public class Main {
public static void main(String ... args) {
Foo foo = new Foo();
foo.print();

ClassLoader cl = ...

Foo foo2 = (Foo) cl.newInstance();
foo2.print();
}
}

第一个 Foo 的 print() 方法打印“Implementation 1”,第二个 Foo 打印“Implementation 2”。 foo 的第二个实例由类加载器从字节数组中检索(可以存储在文件中,或从任何流中获取...)

PS:要求 Foo 是一个类,而不是一个接口(interface),并且不能被扩展,即定义类实现的实际字节(在 VM 内)被覆盖。

最佳答案

是的,这没问题。您应该使用 java.net.URLClassLoader。例如,您可以给它一个 url,它是您覆盖的 Foo.class 文件所在的目录。

编辑:那么你想要的调用是cl.loadClass("Foo").newInstance()。您不能将结果转换为 Foo,但可以使用反射调用其 print 方法。或者使 Foo 成为您不会重新实现的东西的子类(或接口(interface)实现),它定义了 print 方法,并转换为该方法。

关于java - 在运行时替换(覆盖)类实现 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com