gpt4 book ai didi

Java:方法名称/签名解析是否静态完成(编译时)?

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:15 24 4
gpt4 key购买 nike

今天我遇到了一个有趣的问题,我认为这在 Java 中是不可能的。我针对 jgroups 的 2.6 版编译了我的 Java 代码,但在运行时使用了 2.12 版(tomcat Web 应用程序部署)。我收到以下错误

org.jgroups.Message.<init>(Lorg/jgroups/Address;Lorg/jgroups/Address;Ljava/io/Serializable;)

假设从那时起 API 会发生变化,我考虑将我的代码移植到 jgroups-2.12,但令我惊讶的是代码使用 jgroups-2.12 编译得很好并且当我替换新的 jar(没有改变一行我的代码,只是针对 jgroups-2.12 而不是 jgroups-2.6 进行编译),它运行得非常好。

后来发现2.6的构造函数Message(Address, Address, Serializable)在2.12改成了Message(Address, Address, Object)。这意味着在运行时,JVM 试图找到完全相同的方法,但失败了。

这是否意味着 Java 编译器在编译时嵌入了确切的方法名称和精确的参数,而具有更广泛参数的方法将不起作用?

最佳答案

是的,完全正确 - 确切的签名在编译时绑定(bind),这就是包含在字节码中的内容。

事实上,这甚至包括返回类型,它不包含在签名中用于重载目的。

从根本上说,如果您更改现有公共(public) API 成员的任何内容,那将是一个重大更改。您可以摆脱一些仅限语言的更改,例如将 String[] 参数更改为 String... 参数,或引入泛型(在 一些 情况下,如果删除与以前的代码兼容),但仅此而已。

Chapter 13 Java 语言规范的全部内容都是关于二进制兼容性的——阅读它以获取更多信息。但特别是,来自 section 13.4.14 :

Changing the name of a formal parameter of a method or constructor does not impact pre-existing binaries. Changing the name of a method, the type of a formal parameter to a method or constructor, or adding a parameter to or deleting a parameter from a method or constructor declaration creates a method or constructor with a new signature, and has the combined effect of deleting the method or constructor with the old signature and adding a method or constructor with the new signature (see §13.4.12).

关于Java:方法名称/签名解析是否静态完成(编译时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9223938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com