[英]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.