Javaリフレクションとは?新人エンジニア向けにやさしく解説!

自分自身のクラス情報を見て操作する

こんにちは。ゆうせいです。

今回は「Javaのリフレクション(Reflection)」について、プログラミングを始めたばかりの方でも理解できるように、図やたとえ話を交えながら解説していきます!


h2: リフレクションとは何か?

h3: プログラムが「自分自身」を見つめ直す技術

リフレクション(Reflection)とは、Javaプログラムが実行中にクラスやメソッド、フィールドなどの情報を取得・操作できる機能のことです。

たとえば、こんなことが可能です:

  • クラス名からインスタンスを作る
  • メソッドの名前を文字列で指定して呼び出す
  • プライベートなフィールドの値を取り出す(※危険もあります)

たとえ話

これはまるで、自分の履歴書を自分で読んで、それを書き換えるようなものです。

ふつうのJavaでは、クラスやメソッドは「書いた通り」にしか使えませんが、リフレクションを使うと、「名前を後から調べて」「後から呼び出す」ことができるようになります。


h2: リフレクションの使い方を具体的に見てみよう

h3: 例1:クラス情報を取得する

Class<?> clazz = Class.forName("com.example.MyClass");
System.out.println(clazz.getName());

解説

  • Class.forName(...) は、文字列でクラス名を指定して、そのクラスの情報(Classオブジェクト)を取得します。
  • clazz.getName() でクラスの完全修飾名(例:com.example.MyClass)を表示できます。

h3: 例2:インスタンスを生成する

Object obj = clazz.getDeclaredConstructor().newInstance();

解説

  • これはコンストラクタを使って新しいインスタンスを作る方法です。
  • new キーワードを使わずにインスタンスを生成できます。

h3: 例3:メソッドを呼び出す

Method method = clazz.getMethod("greet");
method.invoke(obj);

解説

  • getMethod("greet") は、greetという名前のメソッドを取得します。
  • invoke(obj) は、そのメソッドを指定したオブジェクトで実行することを意味します。

h2: リフレクションのメリットとデメリット

h3: メリット

メリット内容
柔軟性実行時にクラスを決定できるので、汎用的な処理が書ける
フレームワークに必須Springなどのフレームワークでは、リフレクションが活躍している
テストやデバッグプライベートな情報にアクセスして調査できる

h3: デメリット

デメリット内容
パフォーマンス低下実行速度が遅くなることがある
安全性の問題本来アクセスできない部分にアクセスできてしまう
可読性が下がる何をしているかがわかりにくくなる場合がある

h2: 図で理解!通常の呼び出し vs リフレクション

h3: 通常のメソッド呼び出し

MyClass myObj = new MyClass();
myObj.sayHello();

→ 書いたとおりに呼び出される


h3: リフレクションを使った呼び出し

Class<?> clazz = Class.forName("MyClass");
Object obj = clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getMethod("sayHello");
method.invoke(obj);

→ クラス名やメソッド名を文字列で指定するため、柔軟だけど複雑


h2: 数式風に表すと?

リフレクションによるメソッド呼び出しは、次のような式で表せます。

通常の呼び出し式
オブジェクト.メソッド(引数)

リフレクションの場合
メソッド.invoke(オブジェクト, 引数)

日本語で表すと:

通常:「オブジェクトに、メソッドを、引数で呼び出す」

リフレクション:「メソッドに、オブジェクトと引数を渡して呼び出す」


h2: よくある使い道は?

  • フレームワークの内部処理(Spring, Hibernateなど)
  • 汎用ユーティリティクラス(JavaBeansの処理など)
  • デバッグ・ロギングツール
  • プラグインの読み込み

h2: 初心者が気をつけたいポイント

  • パフォーマンスの低下を避けるため、リフレクションは必要なときだけ使うこと
  • セキュリティ上の制約がある(Java9以降は特に厳しくなった)
  • コードが読みづらくなるため、使いすぎないこと

h2: 今後の学習の指針

リフレクションはJavaの高機能なツールですが、いきなり本格的に使いこなす必要はありません。

次のステップとしては、以下の内容を学ぶと理解が深まります。

  • JavaのClassクラスについて詳しく調べてみよう
  • FieldConstructorなど、他のリフレクションクラスにも触れてみよう
  • 実際にSpring Frameworkなどのコードを読んで「どう使われているか」を体験しよう

それでは最後に、リフレクションのしくみをイメージしたイラストをお見せしますね!


リフレクションのイメージイラスト

(実行中に鏡をのぞいて「自分のクラス情報を見て、操作する」ロボットのイメージ)

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。