记录使用Arthas修改线上源码重新加载的一次过程

前情提要

复制代码
线上跑的代码找不到源码了,项目又需要调整某个字段的校验规则,早有耳闻知道可以通过Arthas完成这个场景的需求,实际动手试了试,在此记录一下。

警告!警告!

shell 复制代码
# !!! 重要警告 !!!
# 1. 生产环境谨慎使用,先测试
# 2. 修改前备份原始类
# 3. 确保修改符合JVM规范
# 4. 注意内存泄漏风险
# 5. 重启后会丢失修改

# 安全操作流程:
# 1. jad导出源码备份
# 2. 在小范围测试修改
# 3. mc编译时检查错误
# 4. redefine后立即验证
# 5. 记录修改内容以便后续正式发布

基本流程

shell 复制代码
1. 反编译现有类 -> 2. 修改代码 -> 3. 编译成.class -> 4. 重新加载

启动Arthas

复制代码
进入到Arthas的bin目录下执行 `./as.sh` 命令,选择对应的Java服务。

反编译现有类到指定文件

shell 复制代码
jad --source-only *** > /***/arthas-output/***.java

修改代码

shell 复制代码
vi /***/arthas-output/***.java

编译成.class文件

shell 复制代码
mc -c <ClassLoaderHash> /***/arthas-output/***.java -d /***

查看ClassLoaderHash的值

shell 复制代码
sc -d com.***

输出的内容会显示具体的ClassLoaderHash值

重新加载class文件

shell 复制代码
retransform /***/***.class
相关推荐
NiceCloud喜云9 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
SamDeepThinking9 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
momo9 小时前
JAVA基础知识
java·开发语言
就叫_这个吧9 小时前
Activiti7工作流入门+案例应用
java·activiti7·工作流
Z_W_H_10 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube
折哥的程序人生 · 物流技术专研10 小时前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
郑州光合科技余经理10 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
耀耀_很无聊10 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
奶油话梅糖10 小时前
锐捷常用命令速查表
java·网络·windows
code_std11 小时前
java WebSocket 使用
java·开发语言·websocket