在一个程序中,我使用两个外部 jar 库。
外部库X
中有一个类调用库Y
中某个类的方法m
。库X
是使用库Y
1.0 版本编译的。但是,由于我在代码中将库 Y
用于其他目的,因此我更喜欢使用它的最新版本(假设是 5.0)。
我的问题是,当我执行代码时,库 X
提示方法 m
不再存在(抛出 NoSuchMethod 错误)。不过方法是有的。
问题可能与我使用的库 Y
版本比编译时存在的版本更新有关? (虽然向后兼容,但具有不同的字节码?)。如果是这种情况,那么我会有点困惑,因为我认为 java 方法调用以字节码表示为符号引用(例如方法签名),而不是直接引用(例如偏移量),但我可能误解了东西。
感谢您的澄清!
最佳答案
[...] I thought that java method calls were expressed in byte code as symbolic references (e.g., method signatures), and not as direct references (e.g., offsets) [...]
你的想法是对的;但 Y
v5.0 中的方法可能与 Y
v1.0 中的方法具有不同的签名,即使它们具有相同的名称;例如,它现在可能具有不同数量的参数,或不同类型的参数,或者它可能已变为静态
或非静态
。
关于java - 尝试使用更高版本的 JAR 文件时出现 NoSuchMethod 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8829206/