Greifen Sie auf das konstante Feld im Annotationsprozessor zu

9

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:

%Vor%     
Sam Harwell 12.03.2014, 18:01
quelle

2 Antworten

3

Ich konnte diese Funktion mithilfe der Compiler-Struktur-API implementieren.

  1. 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%
  2. Überschreibe Processor.init , um eine Instanz von Trees zu erhalten.

    %Vor%
  3. Implementieren Sie eine TreePathScanner<TypeMirror, Void> , die verwendet wird, um TypeMirror des Deklarationstyps zu erhalten, der der rule -Eigenschaft in einer Annotation zugewiesen ist.

    %Vor%
  4. Geben Sie einen Standardwert für die Eigenschaft recognizer an. Ich wünschte, dies könnte null sein, aber Java verbietet dies explizit ...

    %Vor%
  5. 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.

    %Vor%
Sam Harwell 15.03.2014, 17:17
quelle
1

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.

    
bcody 14.03.2014 21:14
quelle