「このクラスを変更したら何に影響が出るか分からない」という不安を抱えたままリファクタリングに踏み切れなかった経験が、このシリーズの出発点です。JarvizのJSONLフォーマットさえ理解すれば、Java以外の言語でも同じ武器が使えると気づいたのは大きな収穫でした。

なぜコードの関係を可視化するのか

Javaコード可視化の全体フロー図

図1: Javaコード可視化の全体フロー — 静的解析からクラス図・コールグラフ・Jarviz出力まで

数千クラス・数万メソッドを抱えるJavaシステムに初めて入ったとき、 あるいは長年稼働してきたレガシーシステムを改修するとき、 「このクラスを変更したら何に影響が出るか」を把握するのは容易ではない。

ドキュメントが古い、存在しない——という状況は珍しくない。 IDE の Find UsagesCall Hierarchy は手元の1クラスを起点に辿るには便利だが、 システム全体のホットスポットや循環依存を一目で把握する手段にはなりにくい。

⚠️ こんな場面で可視化が助けになる

・変更の影響範囲が読めずリファクタリングに踏み出せない
・「神クラス」が存在することは分かっているが規模感が掴めない
・デッドコード(呼ばれていないメソッド)が埋もれている
・モジュール間の依存が複雑に絡み合いアーキテクチャが崩壊しかけている

構造と振る舞いを分けて見る意義

コードの関係には大きく2つの側面がある。

視点見えるもの代表的な可視化
構造 クラスの継承・実装・集約関係。「何が何を知っているか」 UMLクラス図・PlantUML
振る舞い メソッドの呼び出し連鎖。「誰が誰を呼ぶか」 Call Graph・シーケンス図

どちらか一方だけでは全体像が掴めない。 構造図でクラスの依存関係を把握し、Call Graph で実行時の呼び出しフローを追い、 最終的に Jarviz の3Dマップで全体を俯瞰する——という3段階のアプローチが有効だ。

📦 JARファイル / ソースコード
↓ 静的解析
📐 Class関連図(継承・依存の構造)
↓ バイトコード解析
🔗 Method Call Graph(呼び出しの振る舞い)
↓ JSONL変換 → Jarviz
🌐 3Dマップ(システム全体の俯瞰)

このシリーズのゴール

このシリーズを読み終えた後、以下ができるようになることを目指す。

シリーズ終了後にできること

1. JavaのClassおよびMethod関係を複数の手法で抽出できる
2. ASM / JavaParser を使って依存関係情報をプログラムで取り出せる
3. Jarviz の JSONL フォーマットを理解し、Java 以外の言語(Python・Kotlin・TypeScript 等)でも同フォーマットを生成して3Dマップを表示できる
4. 3Dマップからホットスポット・デッドコード・循環依存を発見できる

特に JSONL フォーマットの理解と他言語への応用はこのシリーズの目玉である。 Jarviz 自体は Java の JAR を直接解析するツールだが、 内部で使用する jarviz-graph(可視化エンジン)はシンプルな JSONL を受け取るだけでよい。 この事実を理解すれば、どの言語でも同じ3Dマップを活用できる。

可視化手法の選び方

3段階の可視化手法はそれぞれ適した用途がある。状況に合わせて使い分けることが重要だ。

手法適した用途限界
UMLクラス図(PlantUML / Mermaid) 設計レビュー・新メンバーへの説明・クラス構造の理解。静的な依存関係を把握したいとき 大規模コードでは図が膨大になりすぎて読めなくなる。動的な呼び出しは見えない
Method Call Graph(ASM / JavaParser) 影響範囲調査・デッドコード発見・特定メソッドがどこから呼ばれているかの調査 静的解析は実際の実行パスと異なる場合がある(ポリモーフィズム・リフレクション)
Jarviz 3Dマップ システム全体の俯瞰・ホットスポット発見・循環依存の検出・アーキテクチャ全体の健全性確認 細部の確認には不向き。JARまたはJSONLが必要で、ソースがない場合はクラス名のみになる

シリーズ全体マップ

PART 01
はじめに
シリーズ概要・ゴール・前提知識
PART 02
Class関連図
関係の種類・抽出手法・PlantUML/Mermaid
PART 03
Method Call Graph
呼び出し関係・静的/動的解析・限界
PART 04
実践:情報収集
ASM/JavaParserで抽出・JSONL形式への変換
PART 05
Jarviz 3Dマップ
JSONL詳細・他言語応用・セットアップ・読み方
PART 06
まとめ
全体整理・ユースケース・次のステップ

前提知識と環境

項目内容
JavaJava 11 以上(バイトコード解析のため JDK が必要)
Maven / Gradleビルドツールの基本操作が分かること
Node.jsjarviz-graph の実行に必要(v18 以上推奨)
Python(オプション)PART 05 で他言語応用のサンプルとして使用

💡 記事中のコードについて

解析対象サンプルとして order-service(受注)・inventory-service(在庫)・payment-service(決済)という架空のマイクロサービスを想定する。 実際のプロジェクトのコードで試す場合は、パッケージ名・クラス名を適宜読み替えてほしい。

Java可視化でよくある誤り

JavaParserやJarvizを使ってJavaソースを可視化する際、ツール選定とシリーズ全体の設計方針でつまずくケースが多いです。

誤り/失敗パターン何が起きるか正しい対処/防止策
実行トレース系ツール(JProfilerなど)を静的可視化に使おうとする実行環境の準備が必要で大規模レガシーコードには適用できない実行不要な静的解析ツール(JavaParser)を使いAST走査で関係情報を取得する
可視化の目的(クラス関連図 vs Call Graph vs 3D)を決めずに着手する後から出力形式を変えるたびに実装を大幅に作り直す羽目になるPART 01でClass関連図→Call Graph→Jarviz 3Dの段階的アプローチを計画してから実装する
JavaParser非対応のJavaバージョン(記法)のソースを渡すParseExceptionが発生し解析が止まる対象ソースのJavaバージョンとJavaParserのバージョン対応表を確認してから使用する