クラス名.Class
と記述して、リフレクションを使うことで、実際の型がわららなくてもメソッドの読み出しやフィールドへのアクセス、インスタンスの生成などを行うことができる。
Classインスタンスを取得
Class<Exception> A = Exception.class;
インスタンスからClassインスタンスを取得する場合は、getClass()メソッドを使う
Exception instance = new Exception();
Class<? extends Exception> e = instance.getClass();
インスタンスからClassインスタンスを取得する場合は、getClass()メソッドを使う
Class<?> e = Class.forName("java.lang.Exception");
取得したClassインスタンスからは、次のようにして該当クラスに関する情報を取得します。
クラス情報を取得する
//Runnableインターフェイスのclassインスタンスを取得
Class<Runable> c = Runable.calss;
//インターフェイスはどうか
System.out.println(c.isInterFace()); // => true;
//アノテーションはどうか
System.out.println(c.isAnnotation()); // =>false
//配列かどうか
System.out.println(c.isArray()); // => false
//列挙型かどうか
System.out.println(c.isEnum()); // => false
//引数のインスタンスがRunnable型かどうか。
System.out.println(c.isInstance(new Thread())); // => true
//引数のクラスがRunnableのサブクラス/実装クラスかかどうか。
System.out.println(c.isAssignableFrom(Thread.class)); // => true
リフレクション
Classオブジェクトからフィールドやメソッドなどの情報を取得でき、
さらにそれらのフィールドやメソッドを動的に呼び出すことができる。
これをリフレクションと呼ぶ。
リフレクション例
//Classオブジェクトを取得
class<?> clazz = obj.getClass();
//メソッド名と引数の型を指定してMethodオブジェクトを取得
Method method = clazz.getMethod("setName",String.class);
//setName()メソッドを呼び出し
method.invoke(obj, "taro sato");
参考:
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html
https://docs.oracle.com/javase/jp/7/api/java/lang/ClassLoader.html