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

标签 java runtime classloader

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

相关文章:

java - hibernate的orderBy和Collections.sort()的区别

Java:关于写入的空白文件

django - 在运行时更改 Django 设置

Java 导入,不带 CLASSPATH

java - 多线程类加载可能吗?

scala - 为什么SBT的线程上下文类加载器不能加载JDK类文件作为资源?

Java移动开发

java - 使用 Java Generic SOAPClient (SAAJ) 时抛出异常?

java - 被调用的泛型方法如何知道泛型返回的类型?

ios - 用户界面 Storyboard : What's the Correct Way to Get the Active Storyboard?