Java:メソッドパラメータ名称をリフレクションで取得できるようにする



問題

JavaコンパイラもEclipseによるコンパイルもそうなのだが、オプションを指定しないと、メソッドのパラメータ名が.classファイルには書き込まれない。この結果、リフレクションでメソッドを調査しても、そのパラメータ名称は、arg0、arg1、arg2になってしまう。つまり、以下のようなメソッドがあるとして、

public void sample(int foo, String bar)

これをコンパイルしてリフレクションでメソッドを調べると、以下のように見えてしまう。

public void sample(int arg0, String arg1)

Eclipseの場合

Eclipseのコンパイル結果の.classでこれを保持させるには、プロジェクトプロパティの以下をチェックする。

Store information about method parameters (usable via reflection)

と、まさにリフレクションで有用だよとある。

もし、Gradle等で.project、.classpath、.settingsファイルを生成させているのであれば、.settings/org.eclipse.jdt.core.prefsファイルに以下を記述する。

org.eclipse.jdt.core.compiler.codegen.methodParameters=generate

これを記述すると、先のプロジェクトプロパティの該当箇所も自動でチェックされる。

Javaコンパイラの場合

Eclipseでのコンパイル結果とは別途gradleにて再度コンパイルしてjarファイルを作成しているのだが、パラメータ名を保持させるには、Javaコンパイルのオプションを指定しなければならない。

javacに-parametersというオプションをつければ良いらしい。

この例ではMavenの場合のやり方が書いてあるが、Gradleではどう指定するのか?

以下ではどうやってもだめだという。

しかし、結局のところ単純に以下で行けるようだ。

compileJava {
    options.compilerArgs << '-parameters'
}