解决问题:
生产环境出现bug,但是又不方便重新发版启动,可以使用Arthas将线上的代码反编译出来,然后进行修改,修改之后再通过类加载器将类重新进行编译,最后加载到JVM中。
安装Arthas
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
启动Arthas
java -jar arthas-boot.jar
选择要操作的Java进程
jad命令
将需要更改的文件先进行反编译,保存下来 ,编译器修改jad --source com.runlion.middleground.user.api.dto.CementRatioInfoDTO > /data/CementRatioInfoDTO.java
SC命令
查找当前类是哪个classLoader加载的sc -d com.runlion.middleground.user.api.dto.CementRatioInfoDTO | grep classLoader
MC命令
用指定的classloader重新将类在内存中编译mc -c 45a37759 /data/CementRatioInfoDTO.java -d /data
redefine命令
将编译后的类加载到JVMredefine /data/com/runlion/middleground/user/api/dto/CementRatioInfoDTO.class