пʼятниця, 25 квітня 2014 р.

Java без анотацій

Анотація - це конструкція, яка надає метаінформацію про елементи програми процесору анотацій, тобто інформацію, яка сама собою не є частиною алгоритму програми і напряму ніяк не впливає на неї.
// TODO: призначення (Many APIs require a fair amount of boilerplate code).
Процесор анотацій - це утиліта, яка шукає анотації в програмі і, опираючись на інформацію, яку вони несуть, виконує певні дії.

Хоча, анотації не є частиною алгоритму програми, проте з їх допомогою можна впливати на процес компіляції та виконання коду.

Наприклад, в мові Java є анотація @Override.  
Ось декомпільований вихідний код, який її описує:

package java.lang;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

Анотація @Deprecated.

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
} 

Анотація @SuppressWarnings

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
      String[] value();
}


Анотація  @SafeVarargs

package java.lang;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {}


Анотація @Retention

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}


Анотація @Documented

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}


Анотація @Target

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}


Анотація @Inherited

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}


Процесор анотацій, може досліджувати код на 3 різних етапах життя програми:
  1. коли існує лише вихідний код;
  2. коли код скомпільований;
  3. кори програма вже виконується.
Для цього придумали політику зберігання анотацій. Якщо Ви знаєте, що анотіції будуть оброблятись процесором на етапі виконання програми, то Вам потрібно вказати це при створенні типу анотації. Для цього інсуює так звані метаанотіція @RetentionPolicy.
Наприклад,

@RetentionPolicy.RUNTIME
public @interface BottleNeck {
}

@RetentionPolicy.RUNTIME - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися протягом всіх етапів виконання програми.


@RetentionPolicy.CLASS - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися до етапу компіляції програми включно, тобто, в скомпільованих файлах анотації будуть присутні і процесор анотацій зможе їх використати.

@RetentionPolicy.SOURCE - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися лише у вихідному коді, тому процесор анотацій зможе обробляти лише вихідний код. Доступу до анотацій у скомпільованому коді чи в процесі виконання програми він не буде мати.


Джерела інформації:
  • http://en.wikipedia.org/wiki/Annotation
  • http://stackoverflow.com/questions/2793085/what-is-your-alternative-to-annotations
  • http://www.oracle.com/technetwork/articles/hunter-meta-096020.html
  • https://jcp.org/en/jsr/detail?id=175
  • https://jcp.org/en/jsr/platform
  • http://www.java2s.com/Tutorial/Java/0020__Language/Demonstratesthetransientkeyword.htm
  • http://www.cs.indiana.edu/classes/jett/sstamm/
  • http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html
  • http://www.oracle.com/technetwork/articles/hunter-meta-096020.html
  • http://tutorials.jenkov.com/java/annotations.html
  • http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jst.j2ee.doc.user%2Ftopics%2Ftdefiningannotations.html
  • http://docs.oracle.com/javase/7/docs/technotes/guides/language/annotations.html
  • http://www.somanyword.com/2014/02/how-to-create-and-implement-custom-annotations-in-java/
  • http://docs.oracle.com/javase/tutorial/java/annotations/predefined.html
  • http://deors.wordpress.com/2011/10/08/annotation-processors/
  • http://commons.apache.org/proper/commons-beanutils/
  • http://en.wikipedia.org/wiki/Convention_over_configuration
  • http://xdoclet.sourceforge.net/xdoclet/index.html
  • https://www.jcp.org/en/jsr/detail?id=269
  • http://stackoverflow.com/questions/8029279/well-known-jsr-269-pluggable-annotation-processing-api-users-besides-jpa-2-0
  • http://ilikeorangutans.github.io/2013/08/13/jsr-269-annotation-processing/
  • http://scg.unibe.ch/archive/projects/Erni08b.pdf
  • http://docs.oracle.com/javase/7/docs/technotes/guides/apt/
  • http://docs.oracle.com/javase/7/docs/technotes/tools/index.html#basic
  • http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/byoap
  • http://www.angelikalanger.com/Conferences/Slides/JavaAnnotationProcessing-JSpring-2008.pdf
  • http://yourmitra.wordpress.com/2008/02/15/java-custom-annotations-runtime-and-compile-build-time-processing/
  • http://www.informit.com/articles/article.aspx?p=2027052&seqNum=6

Немає коментарів:

Дописати коментар