Обработчик аннотаций, получение модификаторов параметров метода

В настоящее время я работаю над проектом, в котором работаю с пользовательскими аннотациями Java. Я хочу заставить пользователя моей аннотации объявить как минимум final boolean b внутри списка параметров метода, если он аннотировал метод с помощью @Foo. Так что это должно выглядеть примерно так:

@Foo
public void foo(final boolean b) { }

@Foo
public void bar() { } // This should result in an error

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

for (VariableElement parameter : method.getParameters()) {
    Set<Modifier> modifiers = parameter.getModifiers(); // This set is always empty
}

Любые идеи, почему это так?


person michael    schedule 21.06.2017    source источник
comment
Если вы посмотрите на декомпилированный класс, то увидите, что компилятор стирает ключевое слово final из всех окончательных параметров. И это разумно, потому что final имеет смысл только во время компиляции.   -  person Andrew Tobilko    schedule 21.06.2017
comment
Спасибо @AndrewTobilko за быстрый ответ. Теперь я вижу проблему. Так вы говорите, что с моим подходом я не смогу это реализовать? Мне нужно как-то заставить пользователя сделать этот параметр метода final таким, чтобы он не мог переназначить значение переменных внутри тела метода.   -  person michael    schedule 21.06.2017


Ответы (1)


К сожалению, похоже, что final модификаторы параметров не представлены точно (т. е. в соответствии с исходным файлом) классами javax.lang.model. документация пакета javax.lang.model.element говорит (выделено мной):

При использовании в контексте обработки аннотаций должна быть возвращена точная модель представляемого элемента. Поскольку это языковая модель, исходный код обеспечивает реперное (справочное) представление рассматриваемой конструкции, а не представление в исполняемом файле вывода, таком как файл класса. Исполняемый вывод может служить основой для создания элемента моделирования. Однако процесс преобразования исходного кода в исполняемый файл может не позволить восстановить некоторые аспекты представления исходного кода. Например, аннотации с сохранением исходного кода нельзя восстановить из файлов классов, а файлы классов могут не предоставить исходный код. информация о положении. Имена параметров нельзя восстановить из файлов классов. Модификаторы элемента могут отличаться в некоторых случаях, включая:

  • strictfp в классе или интерфейсе
  • final для параметра
  • protected, private и static в классах и интерфейсах
person rolve    schedule 22.06.2017