2016-06-23 2 views
1

Что обрабатывается ранее - static блок или annotation?порядок обработки java аннотаций и статических блоков

Например, что порядок обработки класса, как этот

@CustomAnnotation 
class TemplateClass { 
    static {} 
} 

где класс имеет некоторые annotation и static блок.

+2

- snip - см. Ответ :) – Thomas

+0

В какой ситуации это имеет значение? Когда вы запрашиваете аннотации класса, он уже загружен, и, таким образом, его статический блок инициализации запущен. Мои тесты показывают, что аннотации класса еще не загружены при попытке получить к ним доступ из блока статической инициализации класса. Моя версия Java - это Oracle Java 1.8.0_20 x64. –

+0

@ Томас Это должен быть ответ. – Maroun

ответ

5

Те, кто обрабатывается разными способами, поэтому нет конкретного заказа. Аннотации просто хранятся в метаданных класса (отражение) и должны быть доступны через код отражения, тогда как статические блоки выполняются, когда сам класс загружается загрузчиком классов. Это говорит о том, что отражение может только получить доступ к аннотации после того, как класс был загружен, и, таким образом, вы могли бы сказать, что статический блок выполняется первым (если вы не делаете в нем какие-то злые вещи отражения, и в этом случае я не уверен, что произойдет - вы можете даже сломать приложение - и каждый раз, когда вы делаете такую ​​вещь, умирает котенок;)).

В качестве примера рассмотрим это что, как вы могли бы «процесс» аннотация:

TemplateClass.class.isAnnotationPresent(CustomAnnotation.class); 

Здесь TemplateClass сначала будет загружен, если он уже не имеет и в том, что статический блок будет выполнен. Затем, после того как вы получите доступ к загруженному объекту класса, аннотация «обрабатывается», проверяя, существует ли она в этом классе и предпринимает соответствующие действия.

Редактировать: как прокомментировал @fabian, вы можете выполнить строку выше внутри статического блока, и она должна работать. Тем не менее, скорее правильный ответ: статический блок все равно будет выполнен первым, но выполнение не завершится до тех пор, пока аннотация не будет «обработана».

:: один способ «обработать» аннотации перед статическим блоком, однако: они могут обрабатываться во время компиляции обработчиком аннотации или даже компилятором, если он знает об этих аннотациях. @Deprecated - пример этого.

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

Смежные вопросы