2011-05-01 119 views
1

这是我的问题。比方说,有两班,在运行时更改java类

Class A --> in package PA 
Class B --> in package PB 

在编译的时候,我定义A类和B类。

现在,不管我已经在B级在编译时定义,我想改变它在运行时与A类相同。我的意思是当B类在运行时被加载时,我想删除所有定义的属性,方法。等等。然后将A类中定义的所有内容添加到B类中。

因此,类B就像类A的虚拟副本。在运行时,类B与类A相同,只是它们在不同的包中。

这可能吗?如何?

+10

什么?你为什么想这么做?您的*实际*问题可能有更好的解决方案。 – 2011-05-01 12:03:11

+0

@ user733172你想在运行时创建一个类吗? – Searock 2011-05-01 12:18:41

回答

0

我不认为你可以修改一个加载的类。你可以代理它,从而改变行为,但它不会修改加载的类,你应该有abitiy注入你的实现在正确的位置。

这是制定者有时/往往比在代码中调用new更好的原因之一;它将赋予注入模拟对象(或代理)而不是运行时实现的能力。

我很高兴这是不可能的(或不应该没有修改JVM),因为这将是一个巨大的安全漏洞。

您可以通过使用特制的类加载器来实现类似的效果,该类加载器可识别所请求的类并返回不同的东西。尽管这是一个等待发生的事故。

+0

*“您可能会通过使用特制的类加载器来实现类似的效果,该类加载器可识别所请求的类并返回不同的东西。”* - 我怀疑这完全可行。如果类加载器向请求的类返回了不同的类,它很可能会破坏JVM。 – 2013-08-01 10:19:47

+0

使用代理可以返回不同的类,但需要用变换器修改类名:http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/ClassFileTransformer.html – TJR 2014-03-10 03:33:00