关于 java-decompile
用于反编译 Java 依赖类的技能,主要通过 Vineflower 查看源码,并可用 javap 作为后备。适合需要检查库实现、API 和方法签名的 Java 开发者。
主要功能
- 01使用 Vineflower 反编译 Java 类
- 02搜索 Maven 依赖 JAR
- 03检查方法签名与重载
- 04使用 javap 查看字节码作为后备
适用场景
- 01了解依赖方法的实现
- 02查找准确的参数类型和重载
- 03排查第三方库相关问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ quarkusio/ quarkusdev-skills --skill java-decompile安装后在 Claude Code 中输入/java-decompile确认已加载。
详细介绍
Java 类反编译器
反编译并查看项目依赖中的 Java 类源代码。
概述
此技能通过 jbang 使用 Vineflower(一款现代 Java 反编译器)反编译 Maven 依赖中的 Java 类,让你无需离开当前工作流即可检查库的内部实现、了解 API 实现方式并查找方法签名。
使用场景
- 需要了解库方法的实现方式
- 查找准确的方法签名或参数类型
- 探索依赖的内部实现
- 调试与第三方库相关的问题
- 查找某个类有哪些可用的重载
快速参考
输入格式:
- 完全限定名:
com.fasterxml.jackson.databind.ObjectMapper - 简单名称:
ObjectMapper(将搜索匹配项)
使用的工具:
- Vineflower 反编译器(通过 jbang)
- Maven 类路径
- 后备方案:使用 javap 反汇编字节码
要求:
- 已安装 jbang(https://www.jbang.dev/)
实现
步骤 1:确定类名
解析用户输入(在命令上下文中可通过 $ARGUMENTS 获取):
- 如果包含点号(
.),则视为完全限定名 - 如果是简单名称,则需要先搜索
步骤 2:查找包含该类的 JAR
将类名转换为文件路径:将 . 替换为 /,并附加 .class
选项 A:使用 Maven 类路径文件(首次搜索速度较快)
# Build classpath file if missing
if [ ! -f /tmp/quarkus-classpath.txt ]; then
mvn dependency:build-classpath -Dmdep.outputFile=/tmp/quarkus-classpath.txt -q 2>/dev/null
fi
# Search for the class in classpath JARs
CLASSPATH=$(cat /tmp/quarkus-classpath.txt)
选项 B:直接搜索 Maven 本地仓库
find ~/.m2/repository -name "*.jar" | while read jar; do
if jar tf "$jar" 2>/dev/null | grep -q "com/example/ClassName.class"; then
echo "$jar"
break
fi
done
选项 C:检查本地构建输出(针对项目类)
find . -path "*/target/classes/com/example/ClassName.class" 2>/dev/null
步骤 3:反编译类
主要方法:通过 jbang 使用 Vineflower
Vineflower 处理的是 JAR 文件,因此需要提取特定类或反编译整个 JAR:
# Option A: Decompile specific class from JAR
# Create temp directory for output
TEMP_DIR=$(mktemp -d)
# Decompile the JAR containing the class
jbang org.vineflower:vineflower:RELEASE "/path/to/the.jar" "$TEMP_DIR"
# Find and display the decompiled class
find "$TEMP_DIR" -name "ClassName.java" -exec cat {} \;
# Cleanup
rm -rf "$TEMP_DIR"
# Option B: For single class extraction (faster)
# Extract the class file first
CLASS_FILE="com/example/ClassName.class"
jar xf "/path/to/the.jar" "$CLASS_FILE"
# Decompile just that class
TEMP_DIR=$(mktemp -d)
jbang org.vineflower:vineflower:RELEASE "$CLASS_FILE" "$TEMP_DIR"
cat "$TEMP_DIR/com/example/ClassName.java"
# Cleanup
rm -rf "$CLASS_FILE" "$TEMP_DIR"
后备方法:javap(如果 jbang/Vineflower 不可用)
javap -p -c -cp "/path/to/the.jar" "fully.qualified.ClassName"
注意: jbang 会在首次使用时自动下载并缓存 Vineflower。
步骤 4:展示反编译后的源代码
以语法高亮形式显示反编译后的代码。突出显示关键元素:
- 公共 API 方法及其签名
- 构造函数参数
- 重要字段
- 注解
- 包和导入语句
步骤 5:处理多个匹配项
如果用户提供的是简单类名,且存在多个匹配项:
- 列出所有匹配的类及其所属包
- 显示每个类来自哪个 JAR
- 询问要反编译哪一个
常见模式
在指定 JAR 中搜索:
jar tf /path/to/some.jar | grep -i ClassName
查找名称符合某种模式的所有类:
# Use the class-index if available
grep -i "ClassName" "$HOME/.cache/quarkusdev-skills/class-index.txt"
提示
- Quarkus 内部类可能位于
target/classes/,而不是.m2 - Vineflower 的输出比 javap 更易阅读
- jbang 会自动管理 Vineflower 版本和依赖
- 使用 javap 的
-p标志可显示私有成员 - 对于内部类,请在类名中包含
$ - Vineflower 会反编译整个 JAR;若只需反编译单个类,可先提取该类以加快处理
平台说明
此技能适用于:
- Claude Code:直接执行
- Gemini CLI:使用等效的文件/bash 工具
- Codex:使用等效的 RunBash/ReadFile 工具
工具脚本与平台无关(bash/python)。
评论
支持 Markdown