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

2024-01-08

今天我遇到了一个有趣的问题,我认为这在 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 进行编译),它工作得很好。

后来我意识到构造函数Message(Address, Address, Serializable)2.6中的2.12中更改为消息(地址,地址,对象)。这意味着在运行时,JVM 试图找到完全相同的方法,但未能成功。

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


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

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

从根本上讲,如果您对现有公共 API 成员进行任何更改,这将是一个重大更改。您可以进行一些仅针对语言的更改,例如更改String[]参数aString...参数,或引入泛型(在some情况下,如果擦除与之前的代码兼容),但仅此而已。

第13章 http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.htmlJava 语言规范的全部内容都是关于二进制兼容性 - 阅读该规范以获取更多信息。但特别是,从第13.4.14节 http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#13.4.14:

更改方法或构造函数的形式参数名称不会影响预先存在的二进制文件。更改方法的名称、方法或构造函数的形参类型,或者在方法或构造函数声明中添加参数或删除参数,都会创建具有新签名的方法或构造函数,并具有以下综合效果:删除具有旧签名的方法或构造函数并添加具有新签名的方法或构造函数(请参阅§13.4.12)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 使用 Android AccountManager 获取 gdata 的 authtoken

    所以我试图同步到谷歌文档 而不必询问用户的凭据 我使用此代码来获取身份验证令牌 AccountManager mgr AccountManager get activity authToken mgr blockingGetAuthToke
  • Mac 上的 JFileChooser 看不到中文字符命名的文件?

    该程序在Intellij中运行时运行良好 可以看到中文命名的文件 我将其构建到 jar 文件中 执行了 jar 和JFileChooser无法看到那些文件 我在 Windows 中尝试了该 jar 它工作得很好 这个文件在 Mac OS X
  • PDO——真实的事实和最佳实践? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过 HTML 代码在 UIView 中使用透明背景色

    我正在尝试在 UIView 中显示广告 我需要将背景颜色设置为透明 我尝试使用 viewObject setBackgroundColor UIColor clearcolor 尽管它使 UIView 透明 但它显示白色背景 下面是我尝试过
  • 当 QProcess 需要用户输入 Qt 时如何读取

    我使用 Qt 来实现一个允许开发嵌入式系统的接口 我面临一个问题 为了将程序闪存到嵌入式系统中 我使用 QProcess 以便使用命令 make 和 make flash 保证没有任何问题 程序编译成功 但是当我尝试对 make flash
  • Overlay.draw() 调用多次

    我有一个关于draw 的方法OverlayAndroid 地图中的类 移动地图时的方法draw 接到几次电话 从 4 次到 13 次 这对我来说是个问题 因为这个方法必须用 70000 点重新绘制我的路线 这是很多资源 我找不到这个问题的描
  • .NET 垃圾收集器之谜

    在我的工作中 我们遇到了 OutOfMemoryExceptions 问题 我编写了一段简单的代码来模仿某些行为 最终得到了以下谜团 看看这段简单的代码 当内存不足时 它就会崩溃 class Program private static v
  • 高分子纸波纹

    我试图在按下按钮时更改元素的颜色 我希望当按下按钮并且颜色发生变化时在该元素中触发纸张波纹效果 我该怎么做呢 目标元素
  • 充当文件上传的div?

    我只是想上传或浏览 div 本身 就像作为文件输入并触发其功能 但我的问题是我对 java 脚本很陌生 并且为自己集思广益近一个小时并寻找互联网上同样的问题 所以我别无选择只能在这里提问 my code div style border 1
  • Android AsyncTask 与进度对话框取消

    在我的android应用程序中 我使用带有进度对话框的AsyncTask 请等待登录 来使用我的网页 异步任务内的Web服务功能 登录用户 当用户单击设备上的 后退 按钮时 我想关闭进度对话框并取消 AsynTask 我找不到用于中断 As
  • Swift - 从 JSON 响应创建数据模型

    我正在学习 Swift 语言 很高兴听到其他人输入的内容之一是 如何处理来自 JSON 响应的模型 例如 I have User swift model class User NSObject var user token String v
  • 自动分配spring的bean名称以防止名称冲突?

    在Spring应用程序中 如果两个程序员开发两个包 将 Repository注释为相同的类名 Spring将抛出 IllegalStateException 注解指定的bean名称 mybean 代表 bean 类 foobar packa
  • 如何从 URL 方案中获取参数。

    我在我的 iPhone 应用程序中使用 URL 方案 从一个页面将用户切换到 safari 然后从网页单击一个按钮 我将恢复到应用程序 此时 一些参数是由网页传递的 例如 myapp parameter 1 如何从我的应用程序中找到此参数
  • jQuery.ajax -always() 并不总是运行

    我正在使用 jQuery ajax 进行 REST 调用并检索一些 JSON 它按预期工作 但是 当我强制出现错误条件 例如无效 URL 时 always 方法不会触发 如果我设置 crossDomain false 或 dataType
  • Linux 文件 IO - 多线程性能 - 写入不同的文件

    我目前正在开发一个音频录制应用程序 该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘 简化的 现在 每个流都由一个线程处理 gt 同一线程还在磁盘上执行保存工作 这意味着我有 8 个不同的线程在同一磁盘上执行写入操作 每个线程写入不
  • 有没有办法区分应用程序是在登录时由启动服务启动还是由用户启动? [复制]

    这个问题在这里已经有答案了 Cocoa 应用程序可以将自己添加到LSSharedFileList的登录项目列表 这将允许应用程序在用户登录时启动 但是 有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动 这很有用 因为在一种情况下
  • MacOS Mojave 中未找到 ntpdate 命令

    我有一个 Bash 脚本可以更新我的 mac 时间 但自从 Mojave 更新后找不到该命令 ntpdate u time apple com return ntpdate command not found 我哪里出错了 这是重复的 请检
  • 在python中将文件从latin1转换为utf-8的最快方法

    我需要在 python 中将文件从 latin1 转换为 utf 8 的最快方法 文件很大 2G 我正在移动数据库数据 到目前为止我已经 import codecs infile codecs open tmpfile r encoding
  • ED A0 80 ED B0 80 是有效的 UTF-8 字节序列吗?

    java nio charset Charset forName utf8 decode http docs oracle com javase 7 docs api java nio charset Charset html decode
  • Java:方法名称/签名解析是否静态完成(编译时)?

    今天我遇到了一个有趣的问题 我认为这在 Java 中是不可能的 我针对 jgroups 2 6 版本编译了 java 代码 但在运行时使用了 2 12 版本 tomcat Web 应用程序部署 我收到以下错误 org jgroups Mes