【发布时间】:2013-11-20 02:32:29
【问题描述】:
大家好,谁能帮帮我。
场景:
有关上下文,请查看我的旧帖子。 How to patch a Java program?
所以基本上在我的公司里,如果我必须重新部署一个程序,我只能更新特定的类。这意味着我必须将编译后的类提供给管理员,并告诉他们这些文件应该放在哪里。
问题:
现在我的问题是我有一个名为 ClassA 的类,它由 ClassB、ClassC 和 ClassD 扩展。 ClassA 有一个名为 genericMethodA() 的方法,我想更改它的内部实现。
例子
// old implementation in ClassA
public void int genericMethodA()
{
return 50;
}
// change to this implementation in ClassA
public void int genericMethodA()
{
return 100;
}
// Method in ClassB, ClassC, and ClassD
public void logB()
{
log.info(genericMethodA());
}
ClassB、ClassC 和 ClassD 的字节码会改变吗? 那么如果当 ClassB、ClassC 和 ClassD 调用 genericMethodA() 时,我将新编译的 ClassA.class 放在我的旧 JAR/WAR 中它会返回 50 还是返回 100。
任何人都可以指出java如何编译代码的文档。例如,当一个类被扩展时,编译器会将指令放在子类字节码上还是直接指向基类。
如果您需要更多信息或澄清我的问题,请随时发表评论。
【问题讨论】:
-
不,不会。每个类都有自己的字节码。
-
B的字节码中不存在该方法。因此,当您更改A的字节码,然后从B调用该方法时,您将获得新版本。方法的字节码只存在于实际定义该方法的类中。
-
让自己相信这会奏效的一个简单方法就是尝试一下!但是,我认为您提出的问题仍然很聪明,因为它可能恰好在您的系统上运行,但可能无法正常运行。幸运的是,只要您不尝试反序列化该类实例的旧版本的序列化副本,换出一个类文件应该可以在任何 JVM 上正常工作。
-
如果您好奇不同类的字节码中是什么/不是什么,我会尝试将 .class 文件放入字节码读取程序(如 jclasslib)中:)
-
我不确定我是如何未能回答您的问题的。您更改 A,您将能够从 B、C 和 D 中看到您的更改。这不是您要问的吗?
标签: java compiler-construction bytecode