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にあります。