2016-08-24 4 views
1

С одной стороны, есть @NonNull, для которого Oracle говорит: «Компилятор может определять случаи, когда путь кода может принимать нулевое значение, без необходимости отлаживать NullPointerException». Поэтому, я полагаю, он обрабатывается во время компиляции.Когда обрабатываются аннотации Java?

С другой стороны, есть @Inject, который вводит конструкторы, методы и поля независимо от их модификаторов доступа. Поэтому я полагаю, что они обрабатываются во время выполнения.

Еще одна вещь, которая меня смущает, заключается в том, что поля могут быть введены во время выполнения, хотя они и являются частными. Означает ли это, что поля, содержащие @Inject, должны иметь сеттер?

ответ

3

Это полностью зависит от the runtime retention policy of the annotation.

В аннотации @Inject имеется, например, политика хранения RUNTIME; это означает, что текущий код может проверять такие аннотации и воздействовать на них (здесь «значения ввода», как следует из названия).

Я не знаю конкретно о @NonNull, но он, вероятно, работает так же, как @Nonnull от JSR 305, который имеет политику хранения CLASS. Он используется в таких инструментах, как FindBugs для выполнения анализа байт-кода, например, и создает предупреждения, в которых обнаружено неправильное использование аннотированного элемента.

Наконец, @Override является примером аннотации с политикой хранения SOURCE, и компилятор может использовать ее для определения того, что код неправильно использует аннотацию и приводит к сбою компиляции.

+0

И на вопрос о доступе к частным полям я нашел ответ [здесь] (http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java). Благодарю. – gicig

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