# 第四章第二节--定义注解
标签(空格分隔): 廖雪峰
---
## 如何定义:
使用@interface定义注解(Annatation)
- 注解的参数类似无参数方法.
- 可以设定一个默认值(推荐).
- 把最常用的参数命名为Value(推荐).
![定义注解例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/65827705.jpg)
## 元注解:
可以用来修饰其他注解的注解称为元注解.
JDK已经注释了元注解我们只需要应用即可,无需自己定义元注解.
1. @Target
用来定义Annotation可以被应用的位置.
- 类或者接口:ElementType.TYPE.
- 字段:ElementType.FIFLD.
- 方法:ElementType.METHOD.
- 构造方法:ElementType.CONSTRUCTOR.
- 方法参数:ElementType.PAPAMETER.
2. @Retention
用来定义Annotation的生命周期:
- 仅编译器:RetentionPolicy.SOURCE.
- 仅class文件:RetentionPolicy.CLASS.
- 运行期:RetentionPolicy.RUNTIME.
如果@Retention不存在,则默认为仅编译文件RetentionPolicy.CLASS.
通常定义为Annotation为RetentionPolicy.RUNTIME.
Annotation的声明周期:
RetentionPolicy.SOURCE:是用来给编译器看的,编译完了直接丢弃.
RetentionPolicy.CLASS:存储在class文件中,但是不会be被读取.有一些工具能够处理class文件再处理class文件的时候可以读取这些注解.
RetentionPolicy.RUNTIME:在运行期我们可以通过代码来读取,这些Annotion
3. @Repeatable(JDK>1.8)
定义Annotation是否可以重复.
![重复例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/17427947.jpg)
4. Inherited
定义子类是否可继承父类的Annotation.
- 只能针对@Target为TYPE类型的Annotation
- 仅仅正对class继承
- 对interface继承无效.
![继承例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/66015170.jpg)
## 定义Annotation的步骤
- 第一步:使用@interface 定义一个注解.
![第一步](http://p0b921qfc.bkt.clouddn.com/18-5-18/77443627.jpg)
- 第二步:使用元注解(meta Annotation)来配置这个注解.Target:必须设置,Retention:一般为RUNTIME.Inherited和Repeatable一般不用配置
![添加元注解](http://p0b921qfc.bkt.clouddn.com/18-5-18/63267703.jpg)
- 定义注解的默认值.
![定义值](http://p0b921qfc.bkt.clouddn.com/18-5-18/2437644.jpg)
## 小节小结
- 使用@interface定义注解.
- 可定义多个参数和默认值,核心参数使用value名称.
- 必须设置@Target来指定Annotation使用的范围.
- 应当设置@Retention为RUNTIME便于运行时读取.
- 前言
- 一:Java快速入门
- 二:Java面向对象编程
- 三:Java异常处理
- 错误处理
- Java的异常
- 捕获异常
- 抛出异常
- 自定义异常
- 断言和日志
- 使用断言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射与泛型
- 反射
- Class类
- 访问字段
- 调用方法
- 调用构造方法
- 获取继承关系
- 注解
- 使用注解
- 定义注解
- 处理注解
- 泛型
- 什么是泛型
- 使用泛型
- 编写泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合简介
- Java集合简介
- List
- 使用List
- 编写equals方法
- Map
- Set
- Queue
- Stack
- 最佳实践
- 六:Java IO编程
- 七:Java处理日期和时间
- 八:JUnit单元测试
- 九:Java正则表达式
- 十:Java加密与安全
- 十一:Java多线程编程
- 十二:Maven基础
- 十三:Java网络编程
- 十四:Java操作XML和JSON
- 十五:Java JDBC编程
- 十六:Java函数式编程