问题描述:
在将Hibernate实体类字段int为Integer产生java.lang.NoSuchMethodError,但是明明是有这个方法的,但是一直说没有这个方法。后经仔细对比字节码文件,发现jdk在编译字节码时,会对相关方法进行处理。
详细编译情况如下:
原始代码:
net.setPushstatus(Integer.parseInt(pushstatus));
实体类属性字段类型为int 时编译的代码:
net.setPushstatus(Integer.parseInt(pushstatus));
实体类属性字段类型为Integer时编译的代码:
net.setPushstatus(Integer.valueOf(Integer.parseInt(pushstatus)));
在将int转换为Integer过程中,凡是调用该字段的set方法的类,都会悄悄的进行重新编译。因此,需要将编译后的新的class文件进行重新发布。
类似问题:
1、使用 static final 关键字定义的静态常量,如果该常量的值日后需要改变,那么需要把使用到这个常量的所有class文件进行重新发布。
原因:静态常量在编译时会被jdk直接当字符串处理。因此,后期修改时,只修改常量的值是没有用的。