gpt4 book ai didi

java - 虽然直接调用会抛出java.lang.NoSuchMethodError,但是可以通过反射来调用该方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:58 27 4
gpt4 key购买 nike

这段代码:

Boolean isSecure = configInstance.isSecure();

因以下错误而失败:

java.lang.NoSuchMethodError: org.Config.isSecure()Z

但是,在 Debug模式下我可以通过反射调用相同的内容。

org.Config.class.getMethod("isSecure").invoke(configInstance);

这是方法签名:

public Boolean isSecure();

一些上下文:这是 bean 类的一部分。以前,此方法返回 boolean 原始类型。但是,我想捕获未设置 bean 字段值的场景。我在这里做错了什么?

编辑1:

这是一个示例代码。我在 Mac 上使用 JDK 1.8.0_60。

try {
isSecure = (Boolean) configInstance.getClass().getMethod("isSecure").invoke(configInstance);
log.info("isSecure " + isSecure); // prints true
isSecure = configInstance.isSecure(); // error NoSuchMethodError
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
log.error(e.getMessage(), e);
}

最佳答案

方法已从 boolean xyz() 更改为 Boolean xyz(),但未重新编译到新的 JAR 中。这些方法的签名略有不同。第一个是:

xyz()Z

另一个是:

xyz()Ljava.lang.Boolean;

但是,当您使用反射时,您正在寻找一个名为 xyz 且不带参数的方法。在这两种情况下都存在这样的方法。

但是,当调用 invoke 时,有一个细微的差别:

Boolean b = (Boolean) SomeClass.class.getMethod("xyz").invoke(instance);

不同之处在于,在第一种情况下,自动装箱是从 booleanBoolean 进行的。在第二种情况下,不需要自动装箱。

这就是反射版本适用于这两个版本的原因。

在正常调用中没有出现编译错误的原因如下:

Boolean b = xyz();

...可能是因为您的 IDE 中已加载这两个项目。 IDE将使用本地更改的版本并正确编译。

关于java - 虽然直接调用会抛出java.lang.NoSuchMethodError,但是可以通过反射来调用该方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42922531/

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