我是针对图书馆编程的。
在版本1中,该库有一个getfoo()方法,该方法返回一个映射
在版本2中,getfoo()方法现在返回一个集合
我认为我的代码可以很高兴地:

  Object foo = library.getFoo();

并确定库是否返回映射或集合。
但是,当我针对库的版本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无法定位该方法,因为您正在对具有不同返回类型(在您的情况下设置)的方法的不同版本的类运行该方法。

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

10-10 02:33