Methodenparameterreflexion in Java

Methodenparameterreflexion in Java

1. Überblick

Unterstützung für Methodenparameterreflexion wurde in Java 8 hinzugefügt. Einfach ausgedrückt, bietet es Unterstützung für das Abrufen der Parameternamen zur Laufzeit.

In diesem kurzen Tutorial sehen wir uns an, wie Sie zur Laufzeit auf Parameternamen für Konstruktoren und Methoden zugreifen können - mithilfe von Reflection.

2. Compiler-Argument

Um auf Informationen zum Methodennamen zugreifen zu können, müssen wir uns explizit anmelden.

Dazu haben wirspecify the parameters option during compilation.

Für ein Maven-Projekt können wir diese Option inpom.xml deklarieren:


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

3. Beispielklasse

Wir werden eine erfundenePerson-Klasse mit einer einzelnen Eigenschaft namensfullName verwenden, um Folgendes zu demonstrieren:

public class Person {

    private String fullName;

    public Person(String fullName) {
        this.fullName = fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    // other methods
}

4. Verwendungszweck

Die KlasseParameter ist neu in Java 8 und verfügt über eine Reihe interessanter Methoden. Wenn die Compileroption-parameters bereitgestellt wurde, gibt die MethodeisNamePresent() true zurück.

Um auf den Namen eines Parameters zuzugreifen, können wir einfachgetName(): aufrufen

@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. Fazit

In diesem kurzen Artikel haben wir uns mit der neuen Reflektionsunterstützung für Parameternamen befasst, die in Java 8 verfügbar wurden.

Der naheliegendste Anwendungsfall für diese Informationen ist die Unterstützung der automatischen Vervollständigung in Editoren.

Wie immer kann der Quellcodeover on Github gefunden werden.