Problemstellung:
Kann Java Reflection zum Abrufen der Namen von verwendet werden? lokal deklarierte Variablen? Angenommen ein Codeausschnitt wie:
Foo b = new Foo(); Foo a = new Foo(); Foo r = new Foo();
Können wir eine Methode entwickeln, die die Variablennamen genau bestimmt, wie zum Beispiel:
public void baz(Foo... foos) { for (Foo foo : foos) { // Print the name of each foo - b, a, and r System.out.println(***); // Placeholder for variable name access } }
Lösung:
Bis Java 8 war das Abrufen lokaler Variablennamen über Reflektion nicht möglich. In dieser Version wurde jedoch eine teilweise Unterstützung eingeführt. Parameternamen, ein spezieller Typ lokaler Variablen, wurden durch Reflektion zugänglich. Dies erwies sich als nützlich beim Ersetzen von Annotationen wie @ParameterName, die üblicherweise in Dependency-Injection-Frameworks verwendet werden.
Um umfassendere Informationen zu lokalen Variablennamen zu erhalten, kann die Untersuchung von Klassendateien einige Erkenntnisse liefern. Während der Kompilierung werden diese Daten durch Optimierungstechniken manchmal eliminiert, um Platz zu sparen. Wenn es jedoch vorhanden ist, listet das lokale Variablentabellenattribut einer Methode die Typen und Namen der Variablen innerhalb ihrer jeweiligen Anweisungsbereiche auf.
Bytecode-Engineering-Tools wie ASM können potenziell Mechanismen zur Überprüfung dieser Informationen zur Laufzeit bereitstellen. Angesichts der Nischenanwendung dieser Fähigkeit vor allem in Entwicklungsumgebungen bieten solche Bibliotheken ergänzende Funktionen, die über das bloße Extrahieren von Variablennamen hinausgehen.
Das obige ist der detaillierte Inhalt vonKann Java Reflection lokal deklarierte Variablennamen abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!