繁体   English   中英

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

[英]Substitute (override) class implementation at Runtime (Java)

是否有任何替代(重写)Java类实现的方法,该类实现已由另一个实现(由字节数组提供)由System类加载器加载?

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

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”,第二个打印“Implementation 2”。 foo的第二个实例由类加载器从一个字节数组中检索(可以存储在文件中,也可以从任何流中获取......)

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

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

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

CGLib做这样的事情。 它在Spring和Hibernate中用于此目的。

您可以实现一个检测代理程序并使用java.lang.instrument.Instrumentation#redefineClasses(...)来替换已加载的类的字节码。

我使用JMX取消部署和重新部署类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM