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 .