java.lang.NoSuchFieldError 更改后 class
java.lang.NoSuchFieldError after changing class
我 运行 今天遇到了一个异常,并设法消除了错误。首先,让我给你一个示例代码。
public class Foo () {
protected String var;
}
public class Bar extends Foo () {
public String isVarNull() {
return (this.var == null);
}
}
所以这是我的两个例子 classes。两个 classes 都位于某个 jar 中。在这种情况下一切正常(想象一下它们很有用 classes 并且在一些生产环境中使用)。
我现在所做的就是将 Foo
中 Var
的类型更改为 Integer
.
public class Foo () {
protected Integer var;
}
之后我编译了 class Foo
并用新文件替换了 Jar 中旧的 Class-File。当我现在尝试访问字段 var
时(在 class Bar
的方法 isVarNull()
中)我得到这个异常:
Caused by: java.lang.NoSuchFieldError: test/Bar.var
at test.Bar.isVarNull(Bar.java:6)
据我所知,它与 class Bar
的字节码有关。 compiled classes "know" 代码中使用的 method/variable 类型吗?在这种情况下,Bar
"know" 是什么类型 var
应该 return 并因此抛出错误,因为方法的 returning 类型已更改?
非常感谢详细的回答!
亲切的问候
我认为此处的最佳答案可能有所帮助:NoSuchFieldError Java
但不要太依赖 link,一般的想法是你可能只编译了 Foo
。因此,Foo
的 var
类型确实发生了变化,但 Bar
对 var
应该是什么类型的想法却没有。所以是的,编译 类 做 "know" 他们引用的 method/variable 是什么类型。在这种情况下,Bar
仍然认为它在 Foo
中寻找名为 var
的 String
,但由于它找不到,所以您会收到此错误。我认为,编译两者应该让您的所有 类 再次出现在同一页面上。
您需要重建包含所有 classes 的解决方案。
在基 class 中所做的更改未反映在派生中。
重建您的项目应该可行。
我 运行 今天遇到了一个异常,并设法消除了错误。首先,让我给你一个示例代码。
public class Foo () {
protected String var;
}
public class Bar extends Foo () {
public String isVarNull() {
return (this.var == null);
}
}
所以这是我的两个例子 classes。两个 classes 都位于某个 jar 中。在这种情况下一切正常(想象一下它们很有用 classes 并且在一些生产环境中使用)。
我现在所做的就是将 Foo
中 Var
的类型更改为 Integer
.
public class Foo () {
protected Integer var;
}
之后我编译了 class Foo
并用新文件替换了 Jar 中旧的 Class-File。当我现在尝试访问字段 var
时(在 class Bar
的方法 isVarNull()
中)我得到这个异常:
Caused by: java.lang.NoSuchFieldError: test/Bar.var at test.Bar.isVarNull(Bar.java:6)
据我所知,它与 class Bar
的字节码有关。 compiled classes "know" 代码中使用的 method/variable 类型吗?在这种情况下,Bar
"know" 是什么类型 var
应该 return 并因此抛出错误,因为方法的 returning 类型已更改?
非常感谢详细的回答!
亲切的问候
我认为此处的最佳答案可能有所帮助:NoSuchFieldError Java
但不要太依赖 link,一般的想法是你可能只编译了 Foo
。因此,Foo
的 var
类型确实发生了变化,但 Bar
对 var
应该是什么类型的想法却没有。所以是的,编译 类 做 "know" 他们引用的 method/variable 是什么类型。在这种情况下,Bar
仍然认为它在 Foo
中寻找名为 var
的 String
,但由于它找不到,所以您会收到此错误。我认为,编译两者应该让您的所有 类 再次出现在同一页面上。
您需要重建包含所有 classes 的解决方案。
在基 class 中所做的更改未反映在派生中。
重建您的项目应该可行。