ミズノブログ

ミズノです。プログラミング・子育て・経年変化するもの など好きなことを雑多に書きます。

リフレクションで引数名を取得するときはjavacに-parametersオプションをつける

Javaでリフレクションを利用してメソッドの引数名を取得したかったのですが、ちょっと詰まったのでメモ。
結論としてはコンパイル時、javacに-parametersオプションをつける必要がありました。
以下検証までの手順です。

問題:リフレクションで取得した引数名がargNになる

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class GetArgsName {
    public static void main(String... args) throws NoSuchMethodException, SecurityException {

        Method m = Calc.class.getDeclaredMethod("add", int.class, int.class);
        Arrays.stream(m.getParameters())
            .map(Parameter::getName).forEach(System.out::println);
    }

    public static class Calc {
        public int add(int x, int y) {
            return x + y;
        }
    }
}

上記のプログラムで引数名を取得できると思い、実行してみたところ以下のような結果が。

arg0
arg1

引数名であるx,yを取得したかったのですが、なぜかargNで取得されました。

解決法:javacに-parametersオプションをつける

いろいろ調べた結果、以下のサイトにドンピシャの答えが書いてありました。
ひしだまさんにはいつもお世話になっています。笑

Javaリフレクションメモ(Hishidama's Java Reflection Memo)Javaリフレクションメモ(Hishidama's Java Reflection Memo) 

リフレクションで引数名を取得したい場合、javacに-parametersオプションをつける必要があるとのこと。
またEclipseで実行するときは、プロジェクトのProperties > Java Compiler より以下にチェックを入れればOK。
f:id:nesheep5:20170202140221p:plain

再度実行した結果、以下のように思惑どおり引数名を取得できました。

x
y