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に追加]を見つけることができます。