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

数千クラス・数万メソッドを抱える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マップを活用できる。

シリーズ全体マップ

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(決済)という架空のマイクロサービスを想定する。 実際のプロジェクトのコードで試す場合は、パッケージ名・クラス名を適宜読み替えてほしい。