Problemstellung:
Kann Java Reflection verwendet werden, um die Namen von abzurufen? lokal deklarierte Variablen? Gegeben sei 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.
Für umfassendere Informationen zu lokalen Variablennamen 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 möglicherweise 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3