Анотація - це конструкція, яка надає метаінформацію про елементи програми процесору анотацій, тобто інформацію, яка сама собою не є частиною алгоритму програми і напряму ніяк не впливає на неї.
// 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 різних етапах життя програми:
@RetentionPolicy .
Наприклад,
@RetentionPolicy.RUNTIME
public @interface BottleNeck {
}
@RetentionPolicy.RUNTIME - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися протягом всіх етапів виконання програми.
@RetentionPolicy.CLASS - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися до етапу компіляції програми включно, тобто, в скомпільованих файлах анотації будуть присутні і процесор анотацій зможе їх використати.
@RetentionPolicy.SOURCE - метаанотація, яка вказує на те, що анотація @BottleNeck буде зберігатися лише у вихідному коді, тому процесор анотацій зможе обробляти лише вихідний код. Доступу до анотацій у скомпільованому коді чи в процесі виконання програми він не буде мати.
Джерела інформації:
// 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 {
}
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();
}
Анотація
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();
}
Анотація
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 різних етапах життя програми:
- коли існує лише вихідний код;
- коли код скомпільований;
- кори програма вже виконується.
Наприклад,
@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
Немає коментарів:
Дописати коментар