更改实体字段类型,引用实体的类会重新编译【java.lang.NoSuchMethodError】

来源:互联网 发布:2017年国产动漫数据 编辑:程序博客网 时间:2024/05/22 16:51

项目中遇到一个问题,把实体对象的一个字段从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正常输出:18


步骤三:保存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文件都替换



0 0
原创粉丝点击