mcpField
J
java-decompile

java-decompile

github.com/quarkusio开发4101 次安装33 周前更新
代码仓库

关于 java-decompile

用于反编译 Java 依赖类的技能,主要通过 Vineflower 查看源码,并可用 javap 作为后备。适合需要检查库实现、API 和方法签名的 Java 开发者。

主要功能

  1. 01使用 Vineflower 反编译 Java 类
  2. 02搜索 Maven 依赖 JAR
  3. 03检查方法签名与重载
  4. 04使用 javap 查看字节码作为后备

适用场景

  1. 01了解依赖方法的实现
  2. 02查找准确的参数类型和重载
  3. 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 反汇编字节码

要求:

实现

步骤 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:处理多个匹配项

如果用户提供的是简单类名,且存在多个匹配项:

  1. 列出所有匹配的类及其所属包
  2. 显示每个类来自哪个 JAR
  3. 询问要反编译哪一个

常见模式

在指定 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