こんにちは!
今回は「リフレクション」についてお話しします。名前だけ聞くと難しそうですが、簡単に言うとこういうものです。
リフレクション = プログラムが自分自身の中身を調べたり、操作したりできる仕組み
つまり、プログラムが「自分ってどんなクラスやメソッドを持っているんだろう?」と自己紹介するようなものです。
リフレクションの例え
想像してみてください。
学校で「クラス(例えば1年A組)」がありますよね。
そのクラスには生徒がいて、それぞれ名前や役割(例えば、委員長とか)が決まっています。でも、先生は「そのクラスの名簿を見て誰がいるか確認したり、その生徒に直接お願いをしたり」できますよね?
これが「リフレクション」のイメージです!
- 名簿を見ること → クラスの情報を調べる
- 生徒に直接お願いすること → プログラムの中身を操作する
リフレクションでは、これをプログラムの中で自動的にやるのです。
リフレクションってどうして必要なの?
普段、プログラムを書くとき、クラスやメソッド(関数)を自分で作って使いますよね。
でも、次のような場合には、事前にクラスの中身が分からないことがあります。
- 別の人が作ったクラスを使うとき
例えば、学校の違う先生が作った名簿を渡されたとき。「この名簿には誰が載ってるの?」ってなるかもしれません。 - 実行中に判断したいとき
例えば、ユーザーが何かを入力して、それに応じて違う処理をしたい場合です。どんな名前のメソッドを呼び出すのか、事前に決まっていないことがあります。
実際にリフレクションを使ってみよう!
リフレクションを使うと、プログラムの中で「クラスの情報」を調べたり、動かしたりできます。簡単な例を見てみましょう。
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);
}
}
出力結果:
こんにちは!僕の名前はたろうです!
リフレクションでできることまとめ
- クラスやメソッド、フィールドの情報を調べる
getName()
で名前を取得getDeclaredFields()
で変数を取得getDeclaredMethods()
でメソッドを取得
- クラスやメソッドを操作する
newInstance()
でクラスのインスタンス(実物)を作るinvoke()
でメソッドを実行する
リフレクションの注意点
リフレクションは便利ですが、次の点に注意してください。
- 複雑になりやすい
リフレクションを使うと、プログラムが読みづらくなることがあります。なるべくシンプルに使いましょう。 - パフォーマンスが落ちる場合がある
通常の方法より少し遅くなることがあります。頻繁に使う処理には向いていません。
おわりに
リフレクションを使うと、プログラムが自分自身を調べたり、操作したりできるようになります。ちょっと難しそうに見えますが、慣れるととても便利です。
学校のクラスと名簿を思い出して、自分でコードを書いて試してみてくださいね!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓