Javaにおけるメソッドパラメータの反映

Javaのメソッドパラメータリフレクション

1. 概要

メソッドパラメーターリフレクションのサポートは、Java 8で追加されました。 簡単に言えば、実行時にパラメーターの名前を取得するためのサポートを提供します。

このクイックチュートリアルでは、リフレクションを使用して、実行時にコンストラクターとメソッドのパラメーター名にアクセスする方法を見ていきます。

2. コンパイラ引数

メソッド名情報にアクセスできるようにするには、明示的にオプトインする必要があります。

これを行うには、specify the parameters option during compilationを実行します。

Mavenプロジェクトの場合、このオプションをpom.xmlで宣言できます。


  org.apache.maven.plugins
  maven-compiler-plugin
  3.1
  
    1.8
    1.8
    -parameters
  

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 parameters
        = Arrays.asList(Person.class.getConstructor(String.class).getParameters());
    Optional parameter
        = parameters.stream().filter(Parameter::isNamePresent).findFirst();
    assertThat(parameter.get().getName()).isEqualTo("fullName");
}

@Test
public void whenGetMethodParams_thenOk()
  throws NoSuchMethodException, SecurityException {

    List parameters = Arrays.asList(
      Person.class.getMethod("setFullName", String.class).getParameters());
    Optional parameter= parameters.stream()
      .filter(Parameter::isNamePresent)
      .findFirst();

    assertThat(parameter.get().getName()).isEqualTo("fullName");
}

5. 結論

この簡単な記事では、Java 8で使用可能になったパラメーター名の新しいリフレクションサポートについて説明しました。

この情報の最も明らかな使用例は、エディター内でのオートコンプリートサポートの実装を支援することです。

いつものように、ソースコードはover on Githubで見つけることができます。