Java中的编译器构造基类的更改会影响子类的字节码吗?
嗨,伙计们,有人能帮我吗
场景:
有关上下文,请参阅我以前的帖子。 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的字节码会改变吗如果我把新编译的类放在A中。当ClassB、ClassC和ClassD调用genericMethodA()时,它将返回50或100
还有人能指出java如何编译代码的文档吗。例如,当一个类被扩展时,编译器是将指令放在子类字节码上,还是仅仅指向基类
伙计们,如果你们需要更多关于我的问题的信息或澄清,请不要犹豫发表评论
# 1 楼答案
不,没有
更新类时必须注意的主要事项是编译时确定的事项。这包括在编译时选择并硬编码的方法重载,以及在编译时内联的静态最终基元常量
但总的来说,Java实际上是为了支持修改某些类而不修改其他类。事实上,有一些开发人员指南告诉您什么是可以安全更改的,什么需要重新编译依赖项