是否有任何方法可以替换(覆盖)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/