Annotation

Аннтоации - мехнизм включения метаинформации в код программы.

Аннатации поддерживаются начиная с Java 1.5.

Для того чтобы объявить аннтоацию используется ключевое слово интерфейс, но перед ним ставится знак @

Пример объявления аннотации: public @interface MethodDescription { int id; String synopsis default "[unassigned]"; } Разница в том, что возвращаться могут только перечислымые типа, примитвные типы, другие аннотации и массивы перечислимых типов. Аннотации код никакой не выполняют и исключения не кидают.

Аннотации могут включаться на оразных уровнях 1) Исходный код - тогда используются только компиллятором 2) Храниться в классах ( в байткоде ), но не загружаться при загрузке класса в память 3) Аннтоации, хранящиейся в Runtime.

Разные аннотации используются для разных целей. В исходном для комплиятора, в класс-файлах, например для веб-контейнера или сервера приложений. В runtime аннотации испльзуются с помощью reflection.

Предком интерфейса всех аннотаций является java.lang.Annotation: Class <? extends Annotation> annotationType.... Аннотации можно использовать с практически любым элементом программы. Их можно ставить перед пакетами, классами, методами, конструторами, полями, объявлениями перечислимых типов, интерфейсов, аннотациями.

Аннотации идут перед тем, что они аннотируют @MеthodDescription(id=10 syonpsis="hello world") - тип присваемого значения должен соотвествовать типу возвращаемого значения, которое использовать при описании аннтоации. public ...

Три класса аннотации: SOURCE CLASS RUNTIME

Пример указания политики удержания при описании аннотации: @Rention(RetenrionPolice,RUNTIME) public @interface MethodDescription{{ } Пример: Аннотации можно использовать с помощю Reflection public printAnnoInfo(Objec o) { Class c = o.getClass for (Method m : c) {} ... m.getAnnotation; // получаем аннотацию и если она задана то чтото можем сделать } Чтобы задавать значения без имени, нужно чтобы название метода было value и тогда ее можно использовать как одночленную аннотацию без имени.

Есть еще аннотации маркеры - аннотации без параметров (методов). Получать аннотацию у которых нет параметров смысла нету, поэтому просто проверяют наличие той или иной аннотации при помощи boolean isAnnotationPresent( Class<? extend  annotationClass)

Аннотации, объявленные в java.lang: Deprecated употребляются со всеми элементами и показывает что элемент устарел Override - маркет, ставится перед методами и говорит компилятору что этот метод должен переопределять некоторый метод базового класса SurpressWarnings принимает массив строк, который говорит какие warning не надо показывать. применяется для всего кроме пакетов и аннотаций. Documented - аннотация, маркет. Применяется для других аннотаций и показывает что аннотацию надо включить в документацию. Inherited - аннотация маркет, указывается перед другими аннотациями и указывает что эта аннотация будет наследоваться Retenrion - одночленная аннотация, указывается перед другими аннотациями и определяет политику удержания Target - Одночленная аннотация, которая указывается перед другими аннотациями и показывает к каким элементам может применяться соответствующая аннотация. (Чтобы ограничить перед чем можно ставить аннотация) Параметры ANNOTATION_TYPE, CONSTRUCTOR, ...)

В JAVAEE еще есть аннотация Generated - элемент сгенерирован автоматически PostConstruct - указывает что методв вызывается сразу после конструткора PreDestroy - указывает что данный метод должен вызываться контейнером перед удалением данного класса (это не finilize) Resource - указывает на ресурсы, используемые ...