Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
Javaリフレクションをマスターする
JavaのリフレクションAPIでクラス、メソッド、フィールド、コンストラクタを実行時に検査・変更する方法を学び、柔軟性を高め強力な動的振る舞いを可能にします。
Javaにおいて、リフレクションはプログラム実行中にクラス、インターフェース、コンストラクタ、メソッド、フィールドを調査・操作することを可能にします。
JavaはClassクラスを提供し、クラスやインターフェースのメタデータをカプセル化します。Classのインスタンスはリフレクション機能へのゲートウェイです。
Classオブジェクトの取得
リフレクションを実行するには、まずClassオブジェクトが必要です。取得には3つの一般的な方法があります:
Class.forName()使用Class<Dog> clazz = Class.forName("com.example.Dog");完全修飾クラス名を受け取り、未ロードならクラスをロードします。
- インスタンスで
getClass()使用Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();オブジェクトの実行時クラスを取得。
.classリテラル使用Class<Dog> clazz = Dog.class;Classオブジェクトへのコンパイル時参照を提供。
Classインスタンスを得たら、そのメソッド、フィールド、コンストラクタ、アノテーションを照会できます。
実践例:Dogクラスの検査
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("I am a dog."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
出力**
Name: com.example.Dog Modifier: public Superclass: com.example.Animal
このスニペットでは、Dogインスタンスを作成し、そのClassオブジェクトを取得し、クラス名、アクセス修飾子、スーパークラスを照会しました。
Classの詳細については、公式Java Classドキュメントを参照してください。
フィールド、メソッド、コンストラクタの探索
java.lang.reflectパッケージは、特定メンバを内省する専用クラスを提供します:
Method—— メソッドの詳細。Field—— フィールドの詳細。Constructor—— コンストラクタの詳細。
メソッドのリフレクション
Methodクラスは名前、戻り値型、修飾子などのメタデータを公開します。簡潔な例:
import java.lang.reflect.*; class Dog { public void display() { System.out.println("I am a dog."); } private void makeSound() { System.out.println("Bark Bark"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Method Name: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Return Type: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
出力**
Method Name: display Modifier: public Return Type: void Method Name: makeSound Modifier: private Return Type: void
Methodユーティリティの包括的リストは、公式Methodドキュメントを参照してください。
フィールドのリフレクション
フィールドは実行時にアクセス・変更可能です。Fieldクラスはget、set、修飾子ユーティリティを提供。例:
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // Publicフィールド Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Value: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // Privateフィールド Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "brown"); System.out.println("Value: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
出力**
Value: labrador Modifier: public Value: brown Modifier: private
高度な使用法はFieldクラスドキュメントを参照。
コンストラクタのリフレクション
コンストラクタはConstructorクラスで内省されます。以下はDogの全コンストラクタを列挙するコード:
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Constructor Name: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameters: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
出力**
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
詳細はConstructorドキュメントを参照。
Java
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java継承のマスター:概念、種類、実践例
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Java ArrayList完全マスター:操作・メソッド・ベストプラクティス
- Java Stackクラス完全ガイド:使い方と主要メソッド
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除