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オプションをつける
いろいろ調べた結果、以下のサイトにドンピシャの答えが書いてありました。
ひしだまさんにはいつもお世話になっています。笑
リフレクションで引数名を取得したい場合、javacに-parametersオプションをつける必要があるとのこと。
またEclipseで実行するときは、プロジェクトのProperties > Java Compiler より以下にチェックを入れればOK。
再度実行した結果、以下のように思惑どおり引数名を取得できました。
x
y