2010-07-19 7 views
8

Ich versuche, eine Annotation für eine lokale Variable zu erstellen. Ich weiß, dass ich nicht die Anmerkung in der erzeugten Bytecode behalten kann, aber ich soll den Zugang zu haben, bei der Kompilierung auf die Informationen der Lage sein, von so etwas wie dies zu tun:Wie kann ich einen Annotationsprozessor erstellen, der eine lokale Variable verarbeitet?

@Target({ElementType.LOCAL_VARIABLE}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface Junk { 
    String value(); 
} 

nur, das nicht verarbeitet Bekommt von apt oder javac, wenn ich einen ProcessorFactory angeben, die „Junk“ hat darin Typen in der folgenden unterstützt wird:

class JunkTester { 
    public static void main(String[] args) { 
     @Junk String tmp = "Hello World"; 
     System.out.println(tmp); 
    } 
} 

es wird jedoch funktionieren, wenn ich die @Junk Anmerkung bewegen, bevor public static

Gedanken und oder Problemumgehungen?

+0

neugierig: Was möchten Sie mit lokalen Variablen tun, die mit @Junk kommentiert sind? – irreputable

+1

@Junk ist offensichtlich nur ein Beispiel, aber am Ende möchte ich Code-Generierung von der echten Annotation machen. – apg

+0

ja, aber wenn Sie das tun, manipulieren Sie Code in der Methode, richtig? das scheint im Annotationsprozessor ziemlich schwierig zu sein. – irreputable

Antwort

8

Haben einige schnelle Tests und suchten ein wenig, und es sah aus wie in LOCAL_VARIABLE Einhaken nicht wirklich unterstützt wird ... noch:

http://forums.sun.com/thread.jspa?threadID=775449
http://www.cs.rice.edu/~mgricken/research/laptjavac/
https://checkerframework.org/jsr308/

könnte völlig falsch sein, aber das ist, wie es aussieht ...

+0

Das war auch meine Entdeckung. Ich bin mir nicht sicher, ob es andere Problemumgehungen gibt als einen neuen Compiler wie laptjavac (nun, gepatcht). Ich habe auch gesehen, dass '@ SuppressWarnings', die laut Effective Java als 'LOCAL_VARIABLE'-Annotationen funktionieren, in javac eine besondere Art sind, also sieht es nicht gut aus. – apg

2

Ab Java 8 werden lokale Variablenanmerkungen in der Klassendatei gespeichert.

Ein standardmäßiger Java-Annotationsprozessor verarbeitet die Körper von Methoden nicht. Mit der Checker Framework können Sie jedoch einen Annotationsprozessor schreiben, der jede Annotation einschließlich lokaler Variablen verarbeitet. Seine Annotationsprozessoren können sogar jede Aussage des Programms überprüfen, ob mit Anmerkungen versehen oder nicht.

Verwandte Themen