Как я могу создать процессор аннотаций, который обрабатывает локальную переменную? - PullRequest
8 голосов
/ 20 июля 2010

Я пытаюсь создать аннотацию для локальной переменной.Я знаю, что не могу сохранить аннотацию в сгенерированном байт-коде, но у меня должна быть возможность получить доступ к информации во время компиляции, выполнив что-то вроде этого:

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

только это необрабатываются apt или javac, когда я указываю ProcessorFactory, для которого в поддерживаемых типах есть «Junk», в следующих поддерживаемых типах:

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

Однако он будет работать, когда я перемещу аннотацию @Junk до public static

Мысли и или обходные пути?

Ответы [ 3 ]

8 голосов
/ 20 июля 2010

Сделал несколько быстрых тестов и немного искал, и похоже, что зацепка в LOCAL_VARIABLE не поддерживается ... пока:

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

Может быть совершенно не так, но вот как это выглядит ...

5 голосов
/ 14 декабря 2012

Похоже, что Спецификация аннотаций типа (JSR 308) , мы надеемся, решит эту проблему в будущем ( JDK 8 ?).

2 голосов
/ 21 января 2017

Начиная с Java 8, аннотации локальных переменных хранятся в файле классов.

Стандартный процессор аннотаций Java не обрабатывает тела методов.Тем не менее, Checker Framework позволяет писать процессор аннотаций, который обрабатывает каждую аннотацию, в том числе и для локальных переменных.Его обработчики аннотаций могут даже проверять каждое утверждение программы, независимо от того, аннотировано оно или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...