gpt4 book ai didi

避免 NoSuchMethodError 需要反射(reflection)吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:15 24 4
gpt4 key购买 nike

我正在针对库进行编程。

在版本 1 中,该库有一个返回 Map 的方法 getFoo()

在版本 2 中,该方法 getFoo() 现在返回一个 Set

我以为我的代码可以愉快地:

  Object foo = library.getFoo();

并判断库返回的是 Map 还是 Set。

但是,当我针对库的版本 1 编译我的代码,但针对版本 2 运行它时,我得到 java.lang.NoSuchMethodError: getFoo()Ljava/util/Map;

至少

是这样的
java version "1.7.0_21"
OpenJDK Runtime Environment (IcedTea 2.3.9) (7u21-2.3.9-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

我现在已经通过使用反射解决了这个问题,但我认为没有必要这样做。

所以我的问题是,执行 Object foo = library.getFoo() 是否安全,如果答案是“有时”或“视情况而定”,那么为什么在这种情况下不可行?

最佳答案

当您使用版本 1 编译代码时,您的类字节代码具有此方法的条目,返回类型为 Map。在运行时类被加载,类定义有 getFoo() 返回类型为 Map,因此 JVM 无法找到该方法,因为您正在针对具有不同返回类型的方法的类的不同版本运行它(Set在你的情况下)。

关于避免 NoSuchMethodError 需要反射(reflection)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094748/

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