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

项目中遇到一个问题,把实体对象的一个字段从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文件都替换



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值