2010-07-19 25 views
8

Estoy tratando de crear una anotación para una variable local. Yo sé que no puedo retener la anotación en el código de bytes generado, pero debería ser capaz de tener acceso a la información en tiempo de compilación haciendo algo como esto: solamente¿Cómo puedo crear un procesador de anotación que procese una variable local?

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

, esto no se procesan por apt, o javac cuando especifico un ProcessorFactory que tiene "basura" en los tipos es compatible con lo siguiente:

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

será sin embargo trabajar cuando muevo la anotación @Junk antes public static

Pensamientos y o soluciones?

+0

curious: ¿qué quieres hacer con las variables locales anotadas con @Junk? – irreputable

+1

@Junk es obviamente solo un ejemplo, pero eventualmente me gustaría hacer la generación de código a partir de la anotación real. – apg

+0

sí, pero si lo haces, estás manipulando código dentro del método, ¿verdad? eso parece bastante difícil en el procesador de anotaciones. – irreputable

Respuesta

8

hizo algunas pruebas rápidas y han buscado un poco, y es que parece enganchar en LOCAL_VARIABLE no es realmente el apoyo ... sin embargo:

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

Podría estar totalmente equivocado, pero así es como se ve ...

+0

Eso ha sido mis hallazgos también. No estoy seguro si hay soluciones alternativas a un compilador nuevo como laptjavac (bueno, parcheado). También he visto que '@ SuppressWarnings', que de acuerdo con Java efectivo funcionan como anotaciones' LOCAL_VARIABLE', son una especie de carcasa especial en javac, por lo que no se ve bien. – apg

2

A partir de Java 8, las anotaciones de variables locales se almacenan en el archivo de clase.

Un procesador de anotación Java estándar no procesa los cuerpos de los métodos. Sin embargo, el Checker Framework le permite escribir un procesador de anotación que procesa cada anotación, incluidas las variables locales. Sus procesadores de anotación incluso pueden examinar cada enunciado del programa, ya sea anotado o no.

Cuestiones relacionadas