这是我的问题。比方说,有两班,在运行时更改java类
Class A --> in package PA
Class B --> in package PB
在编译的时候,我定义A类和B类。
现在,不管我已经在B级在编译时定义,我想改变它在运行时与A类相同。我的意思是当B类在运行时被加载时,我想删除所有定义的属性,方法。等等。然后将A类中定义的所有内容添加到B类中。
因此,类B就像类A的虚拟副本。在运行时,类B与类A相同,只是它们在不同的包中。
这可能吗?如何?
这是我的问题。比方说,有两班,在运行时更改java类
Class A --> in package PA
Class B --> in package PB
在编译的时候,我定义A类和B类。
现在,不管我已经在B级在编译时定义,我想改变它在运行时与A类相同。我的意思是当B类在运行时被加载时,我想删除所有定义的属性,方法。等等。然后将A类中定义的所有内容添加到B类中。
因此,类B就像类A的虚拟副本。在运行时,类B与类A相同,只是它们在不同的包中。
这可能吗?如何?
我不认为你可以修改一个加载的类。你可以代理它,从而改变行为,但它不会修改加载的类,你应该有abitiy注入你的实现在正确的位置。
这是制定者有时/往往比在代码中调用new
更好的原因之一;它将赋予注入模拟对象(或代理)而不是运行时实现的能力。
我很高兴这是不可能的(或不应该没有修改JVM),因为这将是一个巨大的安全漏洞。
您可以通过使用特制的类加载器来实现类似的效果,该类加载器可识别所请求的类并返回不同的东西。尽管这是一个等待发生的事故。
*“您可能会通过使用特制的类加载器来实现类似的效果,该类加载器可识别所请求的类并返回不同的东西。”* - 我怀疑这完全可行。如果类加载器向请求的类返回了不同的类,它很可能会破坏JVM。 – 2013-08-01 10:19:47
使用代理可以返回不同的类,但需要用变换器修改类名:http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/ClassFileTransformer.html – TJR 2014-03-10 03:33:00
什么?你为什么想这么做?您的*实际*问题可能有更好的解决方案。 – 2011-05-01 12:03:11
@ user733172你想在运行时创建一个类吗? – Searock 2011-05-01 12:18:41