Zugriff auf Klasse 'Felder ohne Reflektion zu verwenden?

8

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?

    
Geir 09.09.2015, 09:07
quelle

4 Antworten

1

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:

  1. Schreiben Sie einen Annotationsprozessor, der den Quellcode scannt, den Sie widerspiegeln möchten
  2. extrahieren Sie das Feld, auf das Sie zugreifen möchten, über javax.lang.model.element.ElementVisitor

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

    
truthslie 09.09.2015, 11:54
quelle
2

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.

    
T.J. Crowder 09.09.2015 09:11
quelle
0

JPA2 Metamodell (in typensicheren Abfragen "nach Kriterien" verwendet) hat ein ähnliches Konzept.

%Vor%

Wird durch zusätzliche "Pre-Prozessoren" implementiert. Sie können in diesem Bereich untersuchen.

    
Jacek Cz 09.09.2015 09:28
quelle
-1

Nein, das ist es nicht ... aber Sie könnten es mit einer Schnittstelle und einer Schließung erreichen

%Vor%     
lance-java 09.09.2015 09:14
quelle

Tags und Links