リフレクションってなに?具体例から徹底解説【初心者向け】

こんにちは!
今回は「リフレクション」についてお話しします。名前だけ聞くと難しそうですが、簡単に言うとこういうものです。

リフレクション = プログラムが自分自身の中身を調べたり、操作したりできる仕組み

つまり、プログラムが「自分ってどんなクラスやメソッドを持っているんだろう?」と自己紹介するようなものです。


リフレクションの例え

想像してみてください。
学校で「クラス(例えば1年A組)」がありますよね。

そのクラスには生徒がいて、それぞれ名前や役割(例えば、委員長とか)が決まっています。でも、先生は「そのクラスの名簿を見て誰がいるか確認したり、その生徒に直接お願いをしたり」できますよね?

これが「リフレクション」のイメージです!

  • 名簿を見ること → クラスの情報を調べる
  • 生徒に直接お願いすること → プログラムの中身を操作する

リフレクションでは、これをプログラムの中で自動的にやるのです。


リフレクションってどうして必要なの?

普段、プログラムを書くとき、クラスやメソッド(関数)を自分で作って使いますよね。

でも、次のような場合には、事前にクラスの中身が分からないことがあります。

  1. 別の人が作ったクラスを使うとき
    例えば、学校の違う先生が作った名簿を渡されたとき。「この名簿には誰が載ってるの?」ってなるかもしれません。
  2. 実行中に判断したいとき
    例えば、ユーザーが何かを入力して、それに応じて違う処理をしたい場合です。どんな名前のメソッドを呼び出すのか、事前に決まっていないことがあります。

実際にリフレクションを使ってみよう!

リフレクションを使うと、プログラムの中で「クラスの情報」を調べたり、動かしたりできます。簡単な例を見てみましょう。

1. クラスの名前を調べる

public class Student {
    public String name = "たろう";
    public int age = 16;
}

こんなクラスがあります。このクラスについての情報を調べてみましょう。

public class ReflectionExample {
    public static void main(String[] args) {
        // クラス情報を取得する
        Class<?> studentClass = Student.class;

        // クラスの名前を表示
        System.out.println("クラス名: " + studentClass.getName());
    }
}

出力結果:

クラス名: Student

ここでは、Student.classを使ってクラスの情報を取り出しています。


2. フィールド(変数)を調べる

import java.lang.reflect.Field;

public class ReflectionExample {
    public static void main(String[] args) {
        Class<?> studentClass = Student.class;

        // クラスに含まれるフィールドを取得
        Field[] fields = studentClass.getDeclaredFields();

        // フィールドの名前を表示
        for (Field field : fields) {
            System.out.println("フィールド名: " + field.getName());
        }
    }
}

出力結果:

フィールド名: name
フィールド名: age

ここでは、getDeclaredFields()を使って、クラスの中にある「変数」の一覧を表示しています。


3. メソッドを呼び出してみる

今度は、クラスの中にあるメソッド(関数)を使ってみましょう。

public class Student {
    public String greet() {
        return "こんにちは!僕の名前はたろうです!";
    }
}
import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // クラス情報を取得
        Class<?> studentClass = Student.class;

        // インスタンスを作成
        Object student = studentClass.getDeclaredConstructor().newInstance();

        // greetメソッドを取得
        Method greetMethod = studentClass.getDeclaredMethod("greet");

        // greetメソッドを実行
        String result = (String) greetMethod.invoke(student);

        System.out.println(result);
    }
}

出力結果:

こんにちは!僕の名前はたろうです!

リフレクションでできることまとめ

  1. クラスやメソッド、フィールドの情報を調べる
    • getName()で名前を取得
    • getDeclaredFields()で変数を取得
    • getDeclaredMethods()でメソッドを取得
  2. クラスやメソッドを操作する
    • newInstance()でクラスのインスタンス(実物)を作る
    • invoke()でメソッドを実行する

リフレクションの注意点

リフレクションは便利ですが、次の点に注意してください。

  1. 複雑になりやすい
    リフレクションを使うと、プログラムが読みづらくなることがあります。なるべくシンプルに使いましょう。
  2. パフォーマンスが落ちる場合がある
    通常の方法より少し遅くなることがあります。頻繁に使う処理には向いていません。

おわりに

リフレクションを使うと、プログラムが自分自身を調べたり、操作したりできるようになります。ちょっと難しそうに見えますが、慣れるととても便利です。
学校のクラスと名簿を思い出して、自分でコードを書いて試してみてくださいね!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました