前言
要理解注解,先理解元数据的概念。
1.元数据概念
元数据是关于数据的数据。在编译上下文中,元数据是添加到程序元素如方法、字段、类和包上的额外信息。对数据进行说明描述的数据。
(个人理解,有点类似我们平常使用“// ”或“/*...*/”的注释)
2.元数据的作用
- 用于创建文档(根据程序元素上的注释创建文档)
- 跟踪代码中的依赖行(可声明方法是重载,依赖父类的方法)
- 执行编译时检查(可声明是否编译器检测)
- 代码分析。
一、注解的概念
注解(Annotation)在JDK 1.5后增加的一个特性。关于注解的作用,基本就是上述元数据的作用。
注意:
Annotation能用来为程序(类、方法、成员变量等)设置元数据。Annotation不影响程序代码的执行,无论增加、删除Annotation,代码都始终如一地执行。
(Annotation只是用于解释当前类、方法、变量的作用,并且有些注解会在编译结束、类加载中丢弃。)
四种基本元注解:
@Documented 注解是否将包含在JavaDoc中
@Retention 什么时候使用该注解
@Target 注解用于什么地方
@Inhented 是否允许子类继承该注解。
@Documented
一个简单的annotations标记注释,表示是否将注解信息添加到java文档中。
@Retention
定义该注解的生命周期
RetentionPolicy.SOURCE 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码中,如@Override、@SuppressWarnings也是该类注解
RetentionPolicy.CLASS 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方法
RetentionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注释的信息。自定义注解通常使用这种方式。
@Target
表示该注解用于什么地方。如果不明确指出,该注释可以放在任何地方。
@Inherited
定义该注解和子类的关系。
自定义注解
创建自定义注解,与创建接口有几分相似,但注解需要以@开头。
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotataion{
String name();
String website() default "hello";
int revision() default 1;
}自定义注解中定义成员变量的规则:
其定义是以无形参的方法形式来声明的。即:
注解方法不带参数,比如name(),website();
注解方法返回值类型:基本类型、String、Enums、Annotation以及前面这些类型的数组类型
注解方法可有默认值,比如default "hello",默认website=”hello”