Javaでのメソッドパラメータの反映
1. 概要
メソッドパラメータリフレクションのサポートがJava8で追加されました。 簡単に言えば、実行時にパラメーターの名前を取得するためのサポートを提供します。
このクイックチュートリアルでは、リフレクションを使用して、実行時にコンストラクターとメソッドのパラメーター名にアクセスする方法を見ていきます。
2. コンパイラの引数
メソッド名情報にアクセスできるようにするには、明示的にオプトインする必要があります。
これを行うには、コンパイル時にパラメータオプションを指定します。
Mavenプロジェクトの場合、pom.xmlでこのオプションを宣言できます。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
3. クラスの例
fullNameという単一のプロパティを持つ考案されたPersonクラスを使用して、次のことを示します。
public class Person {
private String fullName;
public Person(String fullName) {
this.fullName = fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
// other methods
}
4. 使用法
ParameterクラスはJava8の新機能であり、さまざまな興味深いメソッドがあります。 -parameters コンパイラオプションが指定されている場合、 isNamePresent()メソッドはtrueを返します。
パラメータの名前にアクセスするには、 getName() :を呼び出すだけです。
@Test
public void whenGetConstructorParams_thenOk()
throws NoSuchMethodException, SecurityException {
List<Parameter> parameters
= Arrays.asList(Person.class.getConstructor(String.class).getParameters());
Optional<Parameter> parameter
= parameters.stream().filter(Parameter::isNamePresent).findFirst();
assertThat(parameter.get().getName()).isEqualTo("fullName");
}
@Test
public void whenGetMethodParams_thenOk()
throws NoSuchMethodException, SecurityException {
List<Parameter> parameters = Arrays.asList(
Person.class.getMethod("setFullName", String.class).getParameters());
Optional<Parameter> parameter= parameters.stream()
.filter(Parameter::isNamePresent)
.findFirst();
assertThat(parameter.get().getName()).isEqualTo("fullName");
}
5. 結論
このクイック記事では、Java8で利用可能になったパラメーター名の新しいリフレクションサポートについて説明しました。
この情報の最も明白な使用例は、エディター内でのオートコンプリートサポートの実装を支援することです。
いつものように、ソースコードはGithubのにあります。