java-decompile について
VineflowerでJava依存クラスを逆コンパイルし、ソースを確認するスキルです。ライブラリの実装やAPI、メソッドシグネチャを調べるJava開発者向けです。
主な機能
- 01VineflowerによるJavaクラスの逆コンパイル
- 02Maven依存JARの検索
- 03メソッドシグネチャとオーバーロードの確認
- 04javapによるバイトコード表示への切り替え
活用シーン
- 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 の内部クラスは、
.m2ではなくtarget/classes/にある場合があります - Vineflower は javap より読みやすい出力を生成します
- jbang は Vineflower のバージョンと依存関係を自動的に管理します
- javap で
-pフラグを使用すると、プライベートメンバーを表示できます - 内部クラスでは、クラス名に
$を含めます - Vineflower は JAR 全体をデコンパイルします。単一のクラスの場合は、処理を高速化するために先に抽出してください
プラットフォームに関する注記
このスキルは次の環境で使用できます。
- Claude Code:直接実行
- Gemini CLI:同等のファイル/bash ツールを使用
- Codex:RunBash/ReadFile に相当するものを使用
ツールのスクリプトはプラットフォームに依存しません(bash/python)。