Gibt es eine Möglichkeit, auf eine bestimmte Field
in einer Klasse ohne Reflektion zuzugreifen?
Betrachten Sie diese Klasse:
%Vor% Wo ich Zugang zu theNumber
s java.lang.reflect.Field
bekommen möchte.
Das funktioniert sicher:
%Vor%Allerdings würde ich gerne den Feldnamen überprüfen, also idealerweise so etwas ähnliches (aber natürlich kompiliert mein Beispiel nicht):
%Vor%Ist das möglich oder liegt es an der Compiler-Fähigkeit?
Sie können den Java-Compiler um Annotation-Prozessoren erweitern. Diese Prozessoren sind eine Möglichkeit, Ihren Quellcode während der Kompilierung zu scannen. Sie wurden mit Annotationen eingeführt, aber sie sind in der Lage, den gesamten Quellcode und nicht nur Anmerkungen zu scannen.
Mit dem gescannten Source-Code können Sie Accessor-Klassen für jede kompilierte Klasse generieren. Auf diese Weise können Sie die Reflexion eliminieren.
Wenn Sie nur Fehler erhalten wollen, während Sie Code in Ihre IDE schreiben, können Sie javax.annotation.processing.ProcessingEnvironment.getMessager (). printMessage () (siehe auch javax.tools.DiagnosticListener) verwenden, um Fehler zu erzeugen IDE kann zeigen.
Die Grundidee ist also:
Wenn Sie einen typsicheren Zugriff auf Feld generieren möchten:
3.1. Quelle generieren, die auf diesen Quelltext zugreifen wird
Falls Sie sicherstellen möchten, dass ein reflektierender Aufruf eines Feldes gültig ist:
3.2. einen Fehler über ProcessingEnvironment.getMessager () auslösen. printMessage ()
Natürlich müssen Sie den Code schreiben, um reflektierende Aufrufe zu überprüfen oder die Accessoren zu generieren.
Und die Informationen, die Sie erhalten möchten, müssen aus dem Quellcode extrahierbar sein, da die gesamte Magie während der Kompilierung und nicht zur Laufzeit auftritt
Interessante Frage. Nein, es gibt keine Möglichkeit, dies zu tun, ohne java.lang.reflect
zu verwenden, aber angesichts der integrierten class
pseudo-Eigenschaft für Klassen kann ich sehen, warum Sie fragen.
Nein, das ist es nicht ... aber Sie könnten es mit einer Schnittstelle und einer Schließung erreichen
%Vor%Tags und Links java reflection