2010-07-19 19 views
8

Próbuję utworzyć adnotację dla zmiennej lokalnej. Wiem, że nie mogę zachować adnotacji w wygenerowanego kodu bajtowego, ale powinny mieć możliwość dostępu do informacji w czasie kompilacji, robiąc coś takiego: tylkoJak mogę utworzyć procesor adnotacji, który przetwarza zmienną lokalną?

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

, to nie zostanie przetworzony apt lub javac kiedy podać ProcessorFactory że ma „śmieci” w to obsługiwane typy w następujących przypadkach:

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

to będzie jednak działać, gdy poruszam adnotacji @Junk przed public static

idee i lub obejścia?

+0

ciekawy: co chcesz zrobić ze zmiennymi lokalnymi z adnotacją @Junk? – irreputable

+1

@Junk jest oczywiście tylko przykładem, ale ostatecznie chciałbym wygenerować kod z prawdziwej adnotacji. – apg

+0

tak, ale jeśli to zrobisz, manipulujesz kod wewnątrz metody, prawda? to wydaje się dość trudne w procesorze adnotacji. – irreputable

Odpowiedz

8

zrobił kilka szybkich testów i szukał trochę, a to wygląda jak spinanie do LOCAL_VARIABLE naprawdę nie jest obsługiwany ... jeszcze:

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

Może być całkowicie błędne, ale tak to wygląda ...

+0

To także moje odkrycia. Nie jestem pewien, czy są jakieś obejścia inne niż nowy kompilator, takich jak laptjavac (dobrze, poprawione). Widziałem również, że '@ SuppressWarnings', który zgodnie ze skuteczną Javą działa jak adnotacje' LOCAL_VARIABLE', jest czymś specjalnym cased w javacu, więc nie wygląda dobrze. – apg

2

Od wersji Java 8 lokalne adnotacje zmiennych są przechowywane w pliku klasy.

Standardowy procesor adnotacji Java nie przetwarza treści metod. Jednak funkcja Checker Framework umożliwia zapisywanie procesora adnotacji, który przetwarza każdą adnotację, w tym na zmiennych lokalnych. Jego procesory adnotacji mogą nawet analizować każde stwierdzenie programu, niezależnie od tego, czy jest ono adnotowane czy nie.

Powiązane problemy