Javaにおけるメソッドパラメータの反映
1概要
メソッドパラメータリフレクションのサポートはJava 8で追加されました。簡単に言うと、実行時にパラメータの名前を取得するためのサポートを提供します。
このクイックチュートリアルでは、リフレクションを使用して、実行時にコンストラクタとメソッドのパラメータ名にアクセスする方法を見ていきます。
2コンパイラ引数
メソッド名情報にアクセスできるようにするには、明示的にオプトインする必要があります。
これを行うには、コンパイル中に
parameters
オプションを指定します。
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
クラスはJava 8の新機能で、さまざまな興味深いメソッドがあります。
-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結論
このクイック記事では、Java 8で使用可能になった、パラメータ名の新しいリフレクションサポートについて説明しました。
この情報の最も明白な使用例は、エディタ内でオートコンプリートサポートを実装するのを助けることです。
いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-8[Githubに追加]を見つけることができます。