Categories: Java

【Java入門】リフレクションでprivateメソッドを実行する方法

この記事では、以下のProductクラスが持つ、print(),print2(),print3()メソッドにリフレクションを使ってアクセスする方法をまとめています。

Product.java

public class Product {

    //引数なし、戻り値なしのメソッド
    private void print(){
        System.out.println("ハローワールド");
    }

    //引数あり、戻り値なしのメソッド
    private void print2(String str){
        System.out.println(str);
    }

    //引数あり、戻り値ありのメソッド
    private String print3(String str){
        return str + "です。";
    }
}

メソッドの呼び出し(引数なし、戻り値なし)

引数も戻り値もないprint()を呼び出す方法は以下のとおりです。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//メソッドを取得。
Method method = Product.class.getDeclaredMethod("print");

//メソッドにアクセスできるようにする。
method.setAccessible(true);

//メソッド実行
method.invoke(obj);

実行結果

ハローワールド

メソッドの呼び出し(引数あり、戻り値なし)

引数を取るprint2()を呼び出す方法は以下のとおりです。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//メソッドを取得。
Method method = Product.class.getDeclaredMethod("print2", String.class);

//メソッドにアクセスできるようにする。
method.setAccessible(true);

//メソッド実行
method.invoke(obj, "おはよう世界");

実行結果

おはよう世界

メソッドの呼び出し(引数あり、戻り値あり)

引数を取り、戻り値も返すprint3()を呼び出す方法は以下のとおりです。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//メソッドを取得。
Method method = Product.class.getDeclaredMethod("print3", String.class);

//メソッドにアクセスできるようにする。
method.setAccessible(true);

//メソッド実行
String result = (String) method.invoke(obj, "Javaは世界一");

//戻り値の出力。
System.out.println(result);

実行結果

Javaは世界一です。

getDeclaredMethodとgetMethodの違い

取得したいメンバがpublicの場合はgetMethodで取得することができますが、
public以外のメンバーを取得したい場合はgetDeclaredMethodを使う必要があります。

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

issiki_wp