Angenommen, eine Klasse definiert ein konstantes Feld:
%Vor%Angenommen, eine Annotationsschnittstelle wird wie folgt deklariert:
%Vor%Angenommen, die Annotation wird wie folgt verwendet:
%Vor% Frage: Wie kann ich in einem Annotationsprozessor das Element für CONSTANT_FIELD
verwenden, wenn ich den Wert von @Something
festlege?
Bearbeiten: Ein konkretes Beispiel in die Frage selbst einfügen.
Ich habe eine Anmerkung, die folgendermaßen verwendet wird:
%Vor% Der Annotationsprozessor muss wissen, dass RULE_statement
eine Konstante ist, die in der Klasse BQLParser
definiert ist. Wenn ich direkt auf die Element
für BQLParser.RULE_statement
zugreifen könnte, indem ich die Eigenschaft rule
der Anmerkung festlege, würde die Eigenschaft recognizer
nicht benötigt. Diese Annotation wird in realen Anwendungen tausende Male verwendet, und recognizer
ist immer nur der Deklarationstyp der rule
-Konstante. Das Auflösen dieser Frage würde die Annotationsverwendung vereinfachen:
Ich konnte diese Funktion mithilfe der Compiler-Struktur-API implementieren.
Aktualisieren Sie die pom.xml , um die folgenden Profile einzuschließen, um sicherzustellen, dass tools.jar auf Systemen referenziert wird, auf die standardmäßig nicht verwiesen wird.
%Vor% Überschreibe Processor.init
, um eine Instanz von Trees
zu erhalten.
Implementieren Sie eine TreePathScanner<TypeMirror, Void>
, die verwendet wird, um TypeMirror
des Deklarationstyps zu erhalten, der der rule
-Eigenschaft in einer Annotation zugewiesen ist.
Geben Sie einen Standardwert für die Eigenschaft recognizer
an. Ich wünschte, dies könnte null
sein, aber Java verbietet dies explizit ...
Aktualisieren Sie den Code, der Informationen über die RuleDependency
-Anmerkungen enthält, die auf bestimmte Element
-Instanzen im Code angewendet wurden, um zuerst auf die recognizer
-Eigenschaft zuzugreifen. Wenn sie nicht angegeben wird, verwenden Sie den Deklarationstyp der Konstante in stattdessen die Eigenschaft rule
. Die Fehlerbehandlung wird in diesem Codebeispiel aus Platzgründen weggelassen.
Wenn rule
ein int
ist, wird es dem Annotationsprozessor nicht möglich sein herauszufinden, wo diese int
definiert wurde. Sie könnten jedoch eine enum
anstelle von int
für das Feld rule
verwenden und Ihre Regeln dort mit Verweisen auf ihre Parser gruppieren. Vielleicht in etwa so:
Parser-Schnittstelle:
%Vor%Beispielimplementierung:
%Vor%Regel enum:
%Vor%Annotation mit enum statt int-Feld:
%Vor%Anwendungsbeispiel:
%Vor%Hoffe, dass Sie einige Ideen haben.
Tags und Links java annotations annotation-processing java-compiler-api