プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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();
        }
    }
}