arthas jad
时间: 2025-07-07 16:11:01 浏览: 3
`arthas jad` 是 **Arthas** 诊断工具中的一个命令,用于 **反编译已加载的 Java 类**,帮助开发者在运行时查看类的源代码(即使没有源码或调试信息)。以下是详细说明和用法:
---
### **功能**
- 反编译 JVM 中已加载的类,显示字节码对应的 Java 代码。
- 支持查看核心类库、第三方依赖或项目自身的类。
- 适用于排查问题(如代码逻辑不符预期、代理类生成问题等)。
---
### **基本语法**
```bash
jad [选项] <类名>
```
#### **常用选项**
| 选项 | 说明 |
|------|------|
| `--classLoaderClass` | 指定类加载器(如 `org.springframework.boot.loader.LaunchedURLClassLoader`) |
| `--source-only` | 仅输出源代码(不显示类信息) |
| `-E` | 启用正则表达式匹配类名 |
---
### **使用示例**
#### 1. 反编译简单类
```bash
jad com.example.MyClass
```
输出示例:
```java
/*
* Decompiled with Arthas.
*/
package com.example;
public class MyClass {
public void sayHello() {
System.out.println("Hello Arthas!");
}
}
```
#### 2. 反编译 Spring Boot 启动类
```bash
jad --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader com.example.Application
```
#### 3. 使用正则表达式匹配类名
```bash
jad -E org\.apache\.commons\.lang\..*Utils
```
#### 4. 仅输出源代码(去掉类信息)
```bash
jad --source-only com.example.MyClass
```
---
### **注意事项**
1. **类加载器问题**
- 如果类由自定义类加载器加载(如 Spring Boot、Tomcat),需通过 `--classLoaderClass` 指定正确的类加载器。
- 可通过 `sc -d <类名>` 命令查看类的类加载器信息。
2. **代码可能不完整**
- 反编译的代码可能丢失注释、局部变量名等调试信息(尤其是混淆过的类)。
3. **权限限制**
- 无法反编译 `java.*` 等核心类(受 JVM 安全策略限制)。
4. **与 `mc`/`redefine` 联动**
- 反编译后,可通过 `mc`(内存编译)和 `redefine` 命令动态修改类(需目标类未被内联优化)。
---
### **常见问题**
#### Q1: 反编译失败,提示 `Class not found`?
- 确认类名是否正确(全限定名,如 `com.example.MyClass`)。
- 使用 `sc -d <类名>` 检查类是否已加载及对应的类加载器。
#### Q2: 反编译结果乱码?
- 可能是字节码被混淆或加密,尝试使用其他工具(如 JD-GUI)对比分析。
#### Q3: 如何反编译匿名内部类?
- 匿名类名格式为 `外部类$1`、`外部类$2`,例如:
```bash
jad com.example.OuterClass$1
```
---
### **进阶用法**
#### 结合 `watch` 命令动态分析
```bash
# 反编译类后,观察方法调用
jad com.example.MyService
watch com.example.MyService doSomething '{params, returnObj}' -x 2
```
#### 导出反编译结果到文件
```bash
jad com.example.MyClass > /tmp/MyClass.java
```
---
### **总结**
`arthas jad` 是运行时诊断的利器,尤其适用于:
- 快速查看第三方库的底层实现。
- 排查代码逻辑与预期不符的问题。
- 动态分析生成的代理类(如 Spring AOP、动态代理)。
建议结合 Arthas 其他命令(如 `sc`、`stack`、`watch`)进行深度诊断。
阅读全文
相关推荐


















