?# 第四章第二節--定義注解
標簽(空格分隔): 廖雪峰
---
## 如何定義:
使用@interface定義注解(Annatation)
- 注解的參數類似無參數方法.
- 可以設定一個默認值(推薦).
- 把最常用的參數命名為Value(推薦).

## 元注解:
可以用來修飾其他注解的注解稱為元注解.
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是否可以重復.

4. Inherited
定義子類是否可繼承父類的Annotation.
- 只能針對@Target為TYPE類型的Annotation
- 僅僅正對class繼承
- 對interface繼承無效.

## 定義Annotation的步驟
- 第一步:使用@interface 定義一個注解.

- 第二步:使用元注解(meta Annotation)來配置這個注解.Target:必須設置,Retention:一般為RUNTIME.Inherited和Repeatable一般不用配置

- 定義注解的默認值.

## 小節小結
- 使用@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函數式編程