更改类后的 java.lang.NoSuchFieldError

标签 java exception runtime member

我今天遇到了一个异常,并设法消除了错误。首先,让我给你一个示例代码。

public class Foo () {
    protected String var;
}

public class Bar extends Foo () {
    public String isVarNull() {
        return (this.var == null);
    }
}

这是我的两个示例类。这两个类都位于某个 jar 中。在这种情况下一切正常(想象一下,它们是有用的类,并在一些生产环境中使用)。 我现在要做的就是将 Foo 中的 Var 的类型更改为 Integer

public class Foo () {
    protected Integer var;
}

之后我编译了类 Foo 并用新的替换了 Jar 中的旧类文件。当我现在尝试访问字段 var 时(在类 Bar 的方法 isVarNull() 中)我得到这个异常:

Caused by: java.lang.NoSuchFieldError: test/Bar.var at test.Bar.isVarNull(Bar.java:6)

据我所知,它与 Bar 类的字节码有关。编译类是否“知道”代码中使用的方法/变量的类型?在这种情况下,Bar 是否“知道”var 应该返回什么类型并因此抛出错误,因为方法的返回类型已更改? 非常感谢详细的回答!

亲切的问候

最佳答案

我认为这里的最佳答案可能会有所帮助:NoSuchFieldError Java

但为了不过度依赖链接,一般的想法是您可能只编译了 Foo。因此,Foovar 类型确实发生了变化,但是 Barvar 类型的想法应该不是。所以是的,编译类确实“知道”它们引用的方法/变量的类型。在这种情况下,Bar 仍然认为它正在寻找 Foo 中名为 varString,但是因为它不能'找不到一个,你会得到这个错误。我认为,同时编译两者应该让您的所有类(class)再次出现在同一页面上。

关于更改类后的 java.lang.NoSuchFieldError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38896755/

相关文章:

java - Eclipse 调试器指向源代码中的错误行

java - 使用重定向的 Jsoup 登录网站,并抓取非重定向的页面

java - 无法将 SonarQube 从 4.5.2 升级到 5.0

Android 捕获未处理的异常并显示对话框

c++ - wxWidgets 在编译时包含图像

performance - 算法运行时间

java - 需要帮助加载 ImageIO 插件读取器/写入器

python - Twisted chainDeferred 未按预期工作

python - 使用 Python/SUDS 设置 IncludeExceptionDetailInFaults

运行时的 Java 编译器