【问题标题】:In Java does changes to the BaseClass effect the byte code of the SubClass?在 Java 中,对 BaseClass 的更改是否会影响 SubClass 的字节码?
【发布时间】: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


【解决方案1】:

不,它没有。

更新类时需要注意的主要事项是在编译时确定的。这包括在编译时选择并硬编码的方法重载,以及在编译时内联的静态最终原始常量。

但总体而言,Java 实际上旨在支持修改某些类,同时保持其他类不变。事实上,开发人员指南会告诉您哪些内容可以安全更改,哪些内容需要重新编译依赖项。

【讨论】:

  • 您好 Antimony,只是根据您的回答和 David 评论清楚,子类的字节码不会改变。这是否也意味着如果我不更新 ClassB、ClassC 和 ClassD,它们的 genericMethodA() 仍将返回 50。此外,如果您不介意您是否有指向您所说的文档的链接。甚至你用来找到它的关键字,我一直得到的只是关于如何编译而不是编译器如何工作的教程。
  • @JefreyValencia 没有。他们没有 genericMethodA(). 他们在课堂上有一个 A,,你改为返回 100。所以他们会得到 100。
  • @EJP 感谢您完成答案。由于 Antimony 给出的答案和 EJP 的评论对我来说已经可以了,我将接受这个答案。但我还要注意上面的 David、DaoWen 和 charlie 的帮助。我会接受大卫作为第一个正确答案,但它只是作为评论写的。
  • @Jefrey 查看 Java 语言规范的第 13 章,二进制兼容性。
  • 为什么每个读者都应该搜索它?这是docs.oracle.com/javase/specs/jls/se7/html/jls-13.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多