1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java のリフレクションでできること

Last updated at Posted at 2023-10-23

Java のリフレクション

Java のリフレクションとは、実行時にクラスやメソッドなどの情報を取得したり、実行したりする機能です。

リフレクションを利用するメリット

リフレクションを利用することによって、以下のメリットがあります。

  • クラスやメソッドの情報を取得したり、実行したりすることができるため、実行時にクラスやメソッドを動的に操作することができます。
  • クラスやメソッドの内部構造を直接操作するため、柔軟なコードを作成することができます。
  • フレームワークやライブラリの内部構造を解析することができます。

リフレクションを利用する際の注意点

リフレクションを利用する際には、以下の点に注意が必要です。

  • リフレクションは、実行時にクラスやメソッドの情報を得るため、パフォーマンスに影響を与える可能性があります。
  • リフレクションは、クラスやメソッドの内部構造を直接操作するため、不正な操作を行うと、予期しない結果を招く可能性があります。

リフレクションを利用する例

リフレクションは、以下の用途に利用できます。

  • フレームワークやライブラリの内部構造を解析する
  • ランタイム時にクラスやメソッドを拡張する
  • プロキシパターンを実現する

リフレクションを実際に使ってみる

以下のコードは、com.example.MyClass というクラスを取得し、そのクラスの情報を表示するコードです。

// クラスを取得する
Class<?> clazz = Class.forName("com.example.MyClass");

// クラスの名前を取得する
System.out.println(clazz.getName()); // com.example.MyClass

// クラスのメソッドを取得する
Method[] methods = clazz.getMethods();

// メソッドの名前を取得する
for (Method method : methods) {
  System.out.println(method.getName());
} // sayHello, getAge

// メソッドを実行する
Object instance = clazz.newInstance();
Method sayHelloMethod = clazz.getMethod("sayHello");
sayHelloMethod.invoke(instance); // Hello!

// フィールドを取得する
Field ageField = clazz.getField("age");

// フィールドの値を取得する
Object age = ageField.get(instance);
System.out.println(age); // 20

// フィールドの値を設定
ageField.set(instance, 30);
age = ageField.get(instance);
System.out.println(age); // 30

このコードは、以下の処理を行っています。

  • Class.forName() メソッドを使用して、com.example.MyClass というクラスを取得します。
  • clazz.getName() メソッドを使用して、クラスの名前を取得します。
  • clazz.getMethods() メソッドを使用して、クラスのすべてのメソッドを取得します。
  • method.getName() メソッドを使用して、メソッドの名前を取得します。
  • clazz.newInstance() メソッドを使用して、クラスのインスタンスを生成します。
  • clazz.getMethod() メソッドを使用して、メソッドを取得します。
  • method.invoke() メソッドを使用して、メソッドを実行します。
  • clazz.getField() メソッドを使用して、フィールドを取得します。
  • ageField.get() メソッドを使用して、フィールドの値を取得します。
  • ageField.set() メソッドを使用して、フィールドの値を設定します。

このコードを実行すると、以下の出力結果が得られます。

com.example.MyClass
sayHello, getAge
Hello!
20
30

他にも下記の様に修飾子に関する取得処理などがあります、

  • Modifier.isPrivate(field.getModifiers()) そのフィールドがprivateかを取得します。
  • Modifier.isPrivate(method.getModifiers()) そのメソッドがprivateかを取得します。

リフレクションを使いこなすためのポイント

リフレクションを使いこなすためには、以下のポイントを押さえておくとよいでしょう。

  • リフレクションがどのような機能なのかを理解する。
  • リフレクションを利用する際の注意点を理解する。
  • リフレクションを実際に使ってみる。

リフレクションは、Java の高度な機能ですが、使いこなせるととても便利です。ぜひ、リフレクションを使いこなして、Java プログラミングをより楽しく、より便利にしましょう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?