工作问题小汇总
更新文件替换问题
在项目开发过程中,线上功能替换一般都是只替换个别文件,但是这样会产生一种问题。
问题描述:
项目中有个pojo类EomsWorkSheet其中有个cCMS_ProcessId属性,原来的类型为long,并且该pojo被很多class引用。
public void setCCMS_ProcessId(long cCMS_ProcessId) {
CCMS_ProcessId = cCMS_ProcessId;
}
操作:由于项目需要,需要将cCMS_ProcessId类型改为包装类型Long,更改之后的结果为
public void setCCMS_ProcessId(Long cCMS_ProcessId) {
CCMS_ProcessId = cCMS_ProcessId;
}
之后打包上传。只是更改了该文件并上传。运行之后,发现引用该方法的地方都会报错,提示setCCMS_ProcessId方法找不到。可是类中明明又该方法。
问题解决:
由于是局部进行更新,更改了eomsworksheet内容,也只是局部替换调该类,之前引用该类并使用该方法的二进制class文件并没有同步更新,因此其中的二进制内容仍然只存储的是eomsworksheet类中setCCMS_ProcessId方法为基本数据类型的方法,而此时更改为包装类型,因此会找不到。
找到问题之后,解决方法,将所有引用该方法的类,也重新编译一下一并上传上去即可。
问题扩展:
如果更新方法体内容,不更改方法签名 为什么就没问题?这是只替换方法体内容,而形参 方法名 返回类型没有更改,则方法签名不会发生变化,之前编译好的(引用相应更改类)class文件中的方法签名并没有变化,也是可以正常找到相应的class,并定位到调用的方法,因此可以执行最新的代码,同时之前的class也不需要替换。
同理: 如果该类新增方法,同样不影响之前编译的class,也可正常编译通过。
问题总结:
以后局部替换文件,不要更改原有类的方法签名(返回值、访问权限、形参、方法名),可以新增方法、新增变量、更改方法体,这样只需要替换更新的类即可。如果更改原有类的方法签名,则必须也要将引用该类相应方法的类也进行重新编译,同时一并替换掉。