プログラマってこんなかんじ??

アプリ作ったり歌ったりしてます

クラス内のメソッド定義取得

id:devworks
private なフィールドから値を取得/設定する - devworks
についてのエントリに便乗。

たとえばこんな「dai.Test」っていうクラスがある場合。

package dai;
class Test {
    private String test(String str1, String str2) {
        return str1 + str2;
    }
}

このクラス内のprivateメソッドにアクセスする方法は以下の通り。

try {
    Class c = Class.forName("dai.Test");

    // メソッド取得
    //  Class#getMethodはpublicメソッドのみ取得可能。
    //  Class#getDeclaredMethodは全メソッド取得可能。
    Method m = c.getDeclaredMethod(
                "test", String.class, String.class);

    // privateメソッドアクセス許可
    m.setAccessible(true);

    // メソッド呼出
    m.invoke(c.newInstance(), "あべし", "ひでぶ");

} catch (Exception e) {
    e.printStackTrace();
}

そして、このクラス内のすべてのメソッドの

  • メソッド名
  • 引数の型
  • 返却値の型

を取得/出力する方法は以下の通り。

try {
    Class c = Class.forName("dai.Test");
    for(Method m : c.getDeclaredMethods()) {
        // メソッド名
        System.out.println(m.getName());

        // 引数の型
        for(Class param : m.getParameterTypes()) {
            System.out.println(param.getName());
        }

        // 返却値の型
        System.out.println(m.getReturnType().getName());
    }
} catch (Exception e) {
    e.printStackTrace();
}

各メソッドのメソッド名、引数、返却値がわかるので、指定クラス内のメソッドをすべて呼び出し、とかもできるですね。

こういうのどうやるんー?といまの現場で聞かれたのでちょっと書いてみた。