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ではどう指定するのか?
以下ではどうやってもだめだという。
- How to pass “-parameters” option to javac compiler, when building my java project with gradle?
- How to pass -parameters javac flag to Java compiler via Gradle?
しかし、結局のところ単純に以下で行けるようだ。
compileJava {
options.compilerArgs << '-parameters'
}
ディスカッション
コメント一覧
まだ、コメントがありません