Java 11 Gold 取得に向けた学習記録
リフレクション
リフレクションは、クラス、メソッド、フィールドなどの実行時の情報を動的に取得したり操作したりする機能のことを指す。
リフレクションを使用することで、プログラムの実行時にクラスやオブジェクトのメタデータを取得し、メソッドの呼び出し、フィールドへのアクセス、インスタンスの生成などを行うことができる。
また、リフレクションを利用することでアノテーション情報を取得することができる。
実際にリフレクションを利用するにはjava.lang.reflect
パッケージを使用する。
Class<T>
java.lang.Class<T>
クラスは、クラスが持つメタデータを表す。
リフレクションを利用してClass<T>
オブジェクト取得する方法にはいくつかの手段があり、取得したClass
オブジェクトは class
が予約語であるため、慣例的に変数clazz
に格納されることが多い。
Class.forName()
Class.forName()
を使用して、Class<T>
オブジェクトを取得することができる。forName()
は指定したクラスが見つからないと ClassNotFoundException
が throw
される。
public class MyClass {}
try {
Class<MyClass> clazz = (Class<MyClass>) Class.forName("MyClass");
} catch (ClassNotFoundException e) {
}
class
キーワード
Javaの言語仕様には、class
キーワードを使用してClass<T>
オブジェクトを取得する特殊な構文がある。
public class MyClass {}
Class<MyClass> clazz = MyClass.class;
Object.getClass()
インスタンスからObject.getClass()
メソッドを利用して、Class<T>
オブジェクトを取得することもできる。
public class MyClass {}
MyClass myClass = new MyClass();
Class<? extends MyClass> clazz = myClass.getClass();
ここで使用されている<? extends T>
は上限境界ワイルドカードを呼ばれる。
非境界ワイルドカード<?>
を使用することもできる。
MyClass myClass = new MyClass();
Class<?> clazz = myClass.getClass();