Java リフレクションの使い方(メソッドやフィールドの呼び出し編)
・Sample.java(リフレクションで呼び出されるクラス)
package java_project;
public class Sample {
private String str;
public void setStr(String str) {
this.str = str;
}
public String getStr() {
return str;
}
}
・Main.java(リフレクション実行クラス)
package java_project;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
Sample sample = new Sample();
try {
//リフレクションで引数ありのメソッドを呼び出す場合
//SampleクラスのsetStr(String str)メソッドを呼び出し
Method paramMethod = Sample.class.getMethod("setStr", String.class);
//invoke()メソッドに引数「test」をセット ⇒ setStr("test")を実行している
paramMethod.invoke(sample, "test");
//リフレクションで引数なしのメソッドを呼び出す場合
//SampleクラスのgetStr()メソッドを呼び出し
Method noParamMethod = Sample.class.getMethod("getStr");
//引数なしのinvoke()メソッドをセット ⇒ getStr()を実行して結果をresultに格納
Object result = noParamMethod.invoke(sample);
//「test」が出力される
System.out.println(result);
//リフレクションでフィールドに値をセット
//Sampleクラスのstrフィールドを呼び出し
Field field = Sample.class.getDeclaredField("str");
//strフィールドのアクセス修飾子がprivateなので「setAccessible(true)」でアクセス可能状態にしている
field.setAccessible(true);
//strフィールドに値をセット
field.set(sample, "hoge");
//strフィールドから値を取得
Object value = field.get(sample);
//「hoge」が出力される
System.out.println(value);
} catch(ReflectiveOperationException e) {
throw new RuntimeException();
}
}
}