«1. Обзор

Поддержка отражения параметров метода была добавлена ​​в Java 8. Проще говоря, она обеспечивает поддержку получения имен параметров во время выполнения.

В этом кратком руководстве мы рассмотрим, как получить доступ к именам параметров для конструкторов и методов во время выполнения с помощью отражения.

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. Пример класса

Мы будем использовать надуманный класс Person с одним свойством, называемым fullName, для демонстрации: ~ ~~

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.

Наиболее очевидным вариантом использования этой информации является помощь в реализации поддержки автозаполнения в редакторах.

Как всегда, исходный код можно найти на Github.