项目中遇到一个问题,把实体对象的一个字段从Integer更改为int,更改完后把对应的class文件重新部署到应用中,运行后报Exception in thread "main" java.lang.NoSuchMethodError,感觉很奇怪,于是分析了一下。
以下是在MyEclipse里进行测试分析
步骤一:写两个java类Entity.java,Test.java
package org.test;
public class Entity {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
package org.test;
public class Test {
public static void main (String[] args) {
Entity change = new Entity();
change.setAge(18);
System.out.println(change.getAge());
}
}
步骤三:保存Test.class,将Entity中的Age字段由Integer改为int,如下
package org.test;
public class Entity {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
步骤四:用步骤三保存的Test.class替换新生成的Test.class
步骤五:运行Test报错:Exception in thread "main" java.lang.NoSuchMethodError: org.test.Entity.setAge(Ljava/lang/Integer;)V
at org.test.Test.main(Test.java:6)
分析:
步骤一编写完Test.java后,Test.class反编译的代码如下
package org.test;
import java.io.PrintStream;
public class Test
{
public static void main(String[] args)
{
Entity change = new Entity();
<span style="color:#ff0000;">change.setAge(Integer.valueOf(18));</span>
System.out.println(change.getAge());
}
}
步骤三修改Entity.java后,Test.class反编译代码如下
package org.test;
import java.io.PrintStream;
public class Test
{
public static void main(String[] args)
{
Entity change = new Entity();
<span style="color:#ff0000;">change.setAge(18);</span>
System.out.println(change.getAge());
}
}
通过对比可发现,修改Entity.java后,Test.class重新编译了,部署应用的时候若只替换了Entity.class,Test.class还是旧版本的,
旧版本Test.class中change.setAge(18)编译的结果是setAge(Integer.valueOf(18)),而现在Entity已经改为setAge(int age),找不到对
应的setAge(Integer age)方法,自然就提示
Exception in thread "main" java.lang.NoSuchMethodError: org.test.Entity.setAge(Ljava/lang/Integer;)V。
总结:
在MyEclipse中编辑修改实体字段类型后,引用该实体的对象都会自动重新编译,若需重新部署应用,需要把这些修改的class文件都替换