Java.Annotations
Annotation
0. Annotation Tricks
http://developer.android.com/reference/java/lang/annotation/Annotation.html
0.1 Annotation 接口
"Defines the interface implemented by all annotations. Note that the interface itself is not an annotation,
and neither is an interface that simply extends this one. Only the compiler is able to create proper annotation types."
只有编译器可以创建合适的annotation类型。
0.2 AnnotatedElement 接口
java.lang.reflect.AnnotatedElement
since 1.5
"Represents an annotated element of the program currently running in this VM.
This interface allows annotations to be read reflectively. All annotations returned
by methods in this interface are immutable and serializable." Ref[8]
实现该接口的有:
Class<T> 实现了该接口。
该接口有方法:
abstract <T extends Annotation> T getAnnotation(Class<T> annotationType)
Q: 那么annotationType参数应该接受哪些参数呢?
A: 参考ACRA的ACRA.java中以下方法的实现,
public static ACRAConfiguration getNewDefaultConfig(Application app) {
if(app != null) {
return new ACRAConfiguration(app.getClass().getAnnotation(ReportsCrashes.class));
} else {
return new ACRAConfiguration(null);
}
}
可以看出传给annotationType的值是KLAnnotation.class。
KLAnnotation的定义:
@interface KLAnnotation {}
0.3 关于.class和getClass()的区别,以及关于Class
参见 http://www.cnblogs.com/cwgk/p/4103391.html
0.4 @interface Vs. class Vs. interface
"Annotation type declaration cannot have explicit superinterfaces.
Annotation type declaration cannot have an explicit superclass." Ref[6]
以上说法是否正确? 以及@interface 和class interface是同一级的关键字(或 组件)吗?
1. Annotations 基础
Ref[1,2,3,4,5]
1.1 Annotation简介
"Java annotations are used to provide meta data for your Java code.
Java annotations were added to Java from Java 5. This text covers Java annotations as they look in Java 6.
As far as I know, Java annotations have not changed in Java 7, so this text should be valid for
Java 7 programmers too." Ref[2]
Java注解 用来为Java代码添加元数据。
Java注解典型的被用于:
编译器指令,构建时指令,运行时指令
"Java has 3 built-in annotations that you can use to give instructions to the Java compiler. " Ref[2]
"Java annotations can be be used at build-time, when you build your software project.
The build process includes generating source code, compiling the source, generating
XML files (e.g. deployment descriptors), packaging the compiled code and files into a JAR file etc." Ref[2]
"Normally, Java annotations are not present in your Java code after compilation.
It is possible, however, to define your own annotations that are available at runtime. " Ref[2]
一般情况下,Java注解在编译后不存在于Java代码中。但是可以通过定义自己的注解,这样可以在运行时使用。
1.2 Java注解的写法
@Entity
"@" 告诉编译器这是一个注解。跟在"@"之后的字符串是注解的名字。
Java注解可以有元素(Elements), 你可以给这些元素进行赋值。元素和属性类似。
@Entity(tableName = "vehicles")
上例中的注解有个元素tableName,并给该元素赋值为vehicles。如果注解没有元素,不需要括号。
@Entity(tableName = "vehicles", primaryKey = "id")
注解可以有多个元素。
@InsertNew(value = "yes")
如果注解只有一个元素,通常该元素被命名为value。当注解只有一个元素并且该元素的名字为value时,可以简写为:
@InsertNew("yes")
1.3 注解可以应用的位置
Java注解可以放在classse, interfaces, methods, method parameters, fields and local variables.
@Entity
public class Vehicle {
}
@Entity
public class Vehicle { @Persistent
protected String vehicleName = null; @Getter
public String getVehicleName() {
return this.vehicleName;
} public void setVehicleName(@Optional vehicleName) {
this.vehicleName = vehicleName;
} public List addVehicleNameToList(List names) { @Optional
List localNames = names; if(localNames == null) {
localNames = new ArrayList();
}
localNames.add(getVehicleName()); return localNames;
} }
上例中,示例了注解的使用位置。
1.4 内建的Java注解
Java comes with three built-in annotations which are used to give the Java compiler instructions:
@Deprecated
@Override
@SuppressWarnings
1.4.1 @Deprecated
"The @Deprecated annotation is used to mark a class, method or field as deprecated, meaning it should no longer be used.
If your code uses deprecated classes, methods or fields, the compiler will give you a warning. Here is @Deprecated Java
annotation example:" Ref[2]
@Deprecated
public class MyComponent { }
1.4.2 @Override
"The @Override Java annotation is used above methods that override methods in a superclass.
If the method does not match a method in the superclass, the compiler will give you an error." Ref[2]
1.4.3 @SuppressWarnings
"The @SuppressWarnings annotation makes the compiler suppress warnings for a given method.
For instance, if a method calls a deprecated method, or makes an insecure type cast, the compiler may
generate a warning. You can suppress these warnings by annotating the method containing the code with
the@SuppressWarnings annotation." Ref[2]
1.5 创建自己的注解
和interface,class类似,Java注解定义在自己的文件中。
@interface MyAnnotation {
String value();
String name();
int age();
String[] newNames();
}
@interface: "This signals to the Java compiler that this is a Java annotation definition."
"Notice that each element is defined similarly to a method definition in an interface.
It has a data type and a name. You can use all primitive data types as element data types.
You can also use arrays as data type. You cannot use complex objects as data type." Ref[2]
可以在自己的代码中使用上面定义的注解:
@MyAnnotation(
value="123",
name="Jakob",
age=37,
newNames={"Jenkov", "Peterson"}
)
public class MyClass { }
1.5.1 元素的默认值
可以为元素指定默认值。"That way the element becomes optional and can be left out. "
@interface MyAnnotation {
String value() default "";
String name();
int age();
String[] newNames();
}
"The value element can now be left out when using the annotation. If you leave it out,
it will be considered as if you had used the default value for the value element."
@MyAnnotation(
name="Jakob",
age=37,
newNames={"Jenkov", "Peterson"}
)
public class MyClass { }
在上例中value元素没有被指明值,所以value元素采用默认值。
1.5.2 元注解
元注解:修饰注解的注解。有@Retention @Target @Inherited
1.5.2.1 @Retention
"You can specify for your custom annotation if it should be available at runtime,
for inspection via reflection. You do so by annotating your annotation definition
with the @Retention annotation."
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { String value() default ""; }
"@Retention(RetentionPolicy.RUNTIME) This is what signals to the Java compiler and JVM that the annotation
should be available via reflection at runtime." Ref[2].
在运行时访问annotation可以参考 Ref[11].
另外:RetetionPolicy 类提供了另外的两个值:
RetentionPolicy.CLASS: "means that the annotation is stored in the .class file, but not available at runtime.
This is the default retention policy, if you do not specify any retention policy at all."
RetentionPolicy.SOURCE: "means that the annotation is only available in the source code, and not in the .class
files and not a runtime. If you create your own annotations for use with build tools that scan the code, you
can use this retention policy. That way the .class files are not polluted unnecessarily." Ref[2]
1.5.2.2 @Target
"You can specify which Java elements your custom annotation can be used to annotate. You do so by
annotating your annotation definition with the @Target annotation." Ref[2]
import java.lang.annotation.ElementType;
import java.lang.annotation.Target; @Target({ElementType.METHOD})
public @interface MyAnnotation { String value();
}
ElementType包含一下的targets:
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
"The ANNOTATION_TYPE target means Java annotation definitions. Thus, the annotation can only be used to annotate other annotations. Like the @Target and @Retention annotations.
The TYPE target means any type. A type is either a class, interface, enum or annotation." Ref[2]
1.5.2.3 @Inherited
"The @Inherited annotation signals that a custom Java annotation used in a class should be
inherited by subclasses inheriting from that class." Ref[2]
java.lang.annotation.Inherited @Inherited
public @interface MyAnnotation { } @MyAnnotation
public class MySuperClass { ... } public class MySubClass extends MySuperClass { ... }
"In this example the class MySubClass inherits the annotation @MyAnnotation
because MySubClassinherits from MySuperClass, and MySuperClass has a @MyAnnotation annotation." Ref[2]
1.5.2.4 @Documented
java.lang.annotation.Documented @Documented
public @interface MyAnnotation { } @MyAnnotation
public class MySuperClass { ... }
"When generating JavaDoc for the MySuperClass class, the @MyAnnotation is now included in the JavaDoc." Ref[2]
2. Demo
Ref[9]
3. Annotations 的使用案例
3.1 ACRA的实现
3.2 PerferenceInjector的实现
Ref[9]
4. Annotation Processor
A:如何编写Annotation Processor? 以及调试Processor?
B: 如何没有和Annotation相对应的Processor,那么Annotation会有什么效果?
Items
Java Annotations : Java 注解
RetentionPolicy: 保留策略
Reference
1. Java Annotations and Java Reflection - Tutorial (AAAA) [Read]
http://www.vogella.com/tutorials/JavaAnnotations/article.html
2. Java Annotations (AAAAA) [Read]
http://tutorials.jenkov.com/java/annotations.html
3. Java Annotations By Example (AAAA) [ToRead]
http://whyjavasucks.com/Blog/5/Java_By_Example/93/Java_Annotations
4. Complete Java Annotations Tutorial (AAAA) [ToRead]
http://howtodoinjava.com/2014/06/09/complete-java-annotations-tutorial/
5. Type Annotations in Java 8: Tools and Opportunities (AAA [ToRead]
http://www.infoq.com/articles/Type-Annotations-in-Java-8
6.
http://stackoverflow.com/questions/4722354/can-annotation-implement-interfaces
7. CODE GENERATION USING ANNOTATION PROCESSORS IN THE JAVA LANGUAGE (AAAAA)
https://deors.wordpress.com/2011/09/26/annotation-types/
https://github.com/deors/deors.demos.annotations
8. Interface AnnotatedElement Java doc
http://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/package-summary.html
9. Using Java 6 Processors in Eclipse
http://java.dzone.com/news/using-java-6-processors
10. Getting Started with the Annotation Processing Tool, apt
http://docs.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html
11. Java Reflection and Annotations tutorial
http://tutorials.jenkov.com/java-reflection/annotations.html
12. APT in Eclipse
http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Fguide%2Fjdt_apt_getting_started.htm
13. Explore Annotations in Java 8 [To Read]
https://dzone.com/articles/explore-annotations-in-java-8
Java.Annotations的更多相关文章
- Java Annotations: Explored & Explained--转载
原文地址:http://www.javacodegeeks.com/2012/08/java-annotations-explored-explained.html One of the many w ...
- Java Annotations, Java Reflection, and Java Test Runner
www.vogella.com/tutorials/JavaAnnotations/article.html
- Java custom annotations
Custom annotation definition is similar as Interface, just with @ in front. Annotation interface its ...
- 【译】Core Java Questions and Answers【1-33】
前言 译文链接:http://www.journaldev.com/2366/core-java-interview-questions-and-answers Java 8有哪些重要的特性 Java ...
- Java Annotation概述
@(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...
- java注释指导手册
译文出处: Toien Liu 原文出处:Dani Buiza 编者的话:注解是java的一个主要特性且每个java开发者都应该知道如何使用它. 我们已经在Java Code Geeks提供了丰富 ...
- IREP_SOA Integration程序注释语法Annotations(概念)
20150506 Created By BaoXinjian
- Java Annotation 机制源码分析与使用
1 Annotation 1.1 Annotation 概念及作用 1. 概念 An annotation is a form of metadata, that can be added ...
- mybatis Java API
既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...
随机推荐
- 在Centos 6.5 X64下切割m3u8
操作系统:centos 6.5 必需要参考的文章: http://blog.chinaunix.net/uid-23069658-id-4018842.html 准备工作: 安装git yum ins ...
- C# Excel转换为Json
demo:https://files.cnblogs.com/files/guxingy/Excel%E8%BD%AC%E6%8D%A2%E4%B8%BAJson%E5%AF%B9%E8%B1%A1. ...
- 学习JS的心路历程-范围Scope和提升(Hoisting)
在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...
- 1.3.2、CDH 搭建Hadoop在安装之前(端口---Cloudera Navigator加密使用的端口)
列出的所有端口都是TCP. 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外部通信. 零件 服务 港 ...
- javascript学习笔记(七):事件详解
HTML事件处理 <!DOCTYPE html> <html> <head lang="en"> <meta chaset="U ...
- jstorm集成kafka
本人是spark的拥趸,因为工作中需要用到jstorm,作记录如下. pom.xml <dependencies> <dependency> <groupId>co ...
- 【Spider】学习使用XMLFeedSpider
前面写了学习CrawlSpider遇到的问题后,今天学XMLFeedSpider又出现了启动后没爬取到数据,但又不报错的情况 经过排查,发现又是一个粗心大意的错误: class SpiderUserX ...
- ucore-lab1-练习4report
练习四:分析bootloader加载ELF格式的OS的过程 1.bootloader如何读取硬盘扇区? (1)在练习3中实现了bootloader让CPU进入保护模式,下一步的工作就是从硬盘上加载并 ...
- NumPy 排序、条件刷选函数
NumPy 排序.条件刷选函数 NumPy 提供了多种排序的方法. 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性. 下表显示了三种排序算法 ...
- pandas中series和dataframe之间的区别
series结构有索引,和列名组成,如果没有,那么程序会自动赋名为None series的索引名具有唯一性,索引可以数字和字符,系统会自动将他们转化为一个类型object. dataframe由索引和 ...