ElementType.Тип аннотации локальной переменной

Я хотел бы создать свои собственные аннотации, чтобы аннотировать некоторую локальную переменную. Написать аннотацию не проблема, проблема в том, чтобы получить информацию о них во время выполнения. Я мог получить некоторую информацию только из аннотированных методов или параметров метода, но не из локальных переменных. Есть ли способ получить его?

моя собственная аннотация примерно такая:

public void m(int a)  
@MyOwnAnnotation(some information)  
int b = 5;  
}  

или, в качестве альтернативы, есть ли способ, чтобы получить код метода, чтобы разобрать его далее и, наконец, получить значение аннотации?

спасибо заранее.

4 ответов


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

вы можете посмотреть http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html

аннотации локальных переменных не сохраняются в файлах классов (или во время выполнения) независимо от политики хранения, установленной для типа аннотации. Видеть JLS 9.6.1.2.

Если вы не хотите получать код метода, вы можете использовать JavaParser (http://javaparser.org/).


начиная с Java 8 аннотации локальных переменных сохраняются в файлах классов. Как отметил Эрик Хагстром, эта давняя ошибка была исправлена JSR 308, которая также добавила аннотации типа к языку Java.

однако API отражения Java не был обновлен для предоставления доступа в телах методов. Вам нужно будет самостоятельно проанализировать classfile. Вы можете использовать такой инструмент, как ASM. Я не рекомендую JavaParser, потому что он не был обновлен за пределами Java 1.5.


JLS 9.6.1.2 действительно указывает, что аннотации локальных переменных не сохраняются. Однако,JSR 308 работает свой путь через процесс сообщества. Это должно дать вам возможность вам нужно.

Если вы хотите временное решение, вот реализация JSR 308.


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

однако у меня была проблема simimlar и мне удалось придумать решение с использованием полей. Пример кода приведен ниже:

Интерфейс Класса

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface test{
}

POJO-класс

public class testObject{
    @test
    private String one;
    private String two;

    //Getters and Setters
}

Получить Объект значения

public void getFields (Object obj){
    Field fields = obj.getClass().getDeclaredFields();

    for (Field f : fields){
        test fieldAnnotation = f.getAnnotation(test.Class);
        if (fieldAnnotation != null){
            f.get(obj);
            // Do things here based on the values
        }
    }
}

Основной Класс

public static void main(String[] args){
    //Create object
    testObject test = new testObject();

    test.setOne("testOne");
    test.setTwo("testTwo");
    getFields(test);
}

надеюсь, это поможет объяснить, как вы можете получить поля для объекта на основе аннотации. Вы просто используете аннотацию, чтобы "пометить" поля, которые вы хотите получить, а затем прочитать значение из объекта.