JAVA注解原理 - 感性認識

一、什么是注解?

注解的英文是annotation,就是使用@符號來標注類、方法、類成員、局部變量、方法參數等。用于表示一些特殊的含義。比如我們常見的@Controller, @Service, @Repository, @Autowired等。

二、為什么要有注解? 注解有什么作用?

我理解這跟編程思想中的DRY(don't repeat yourself)的原則是吻合的。用統一的一個標識符@來標識一組具有相同屬性的對象。
在Spring中,框架會自動掃描被標注的類,并把使用@Componet標注的類以bean的形式注入到框架中。方便供框架管理這些類的創建與銷毀。
我們常用的JUnit,也會自動掃描被@Test標注的方法,認為它們是單獨供JUnit框架管理的單測方法。
所以,使用注解,就是為了方便我們為類、方法、屬性、參數等對象打一個標簽,做一個標識。開發框架或架構師可以根據這些標識做自己的邏輯處理。

三、如何實現自定義注解?

3.1 通過元注解來實現注解

拿我們經常用到的@Autowired來舉例,

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;

}

解釋:
通過 @interface 來聲明一個注解。

@Target 說明注解所修飾的對象范圍,取值的話,有

  1. CONSTRUCTOR: 構造器
  2. FIELD: 域
  3. LOCAL_VARIABLE: 局部變量
  4. METHOD: 方法
  5. PACKAGE: 包
  6. PARAMETER: 參數
  7. TYPE: 類、接口、enum聲明

@Retention描述注解的生命周期,在什么時候生效,有3個

  1. SOURCE
  2. CLASS
  3. RUNTIME

@Documented說明可被javadoc此類工具文檔化

@Inherited說明被標注的類型是被繼承的(// TODO 舉例說明)

3.2 如何獲取注解名與值

通過反射。關于什么是反射,會單獨寫一個筆記來記錄。在這里,我們先有一個概念,就是可以通過某一種方法來獲取注解的名稱,以及其中的值。
// todo 舉例

@Hello
public class Any {

}

屬性上的

@Hello
private String name;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,937評論 18 139
  • 什么是注解 注解對于開發人員來講既熟悉又陌生,熟悉是因為只要你是做開發,都會用到注解(常見的@Override);...
    張明云閱讀 25,324評論 6 154
  • 最近,北京打工的肓兒嫂范雨素火了。因為一篇感人至深,讓千萬人為之動容的文章。 看她的照片一一 樸素,平凡,簡單,像...
    般若秋雪閱讀 526評論 1 11
  • Unix指令 //在輸入文件明時,按tab鍵可以提示輸出所要的文件名 open +文件名 ——打開當前路徑的文件 ...
    CharlesAn閱讀 405評論 0 1
  • 第一招 每天早上一上班,在心里喊:我最重要的KPI是XXX 你每天打開電腦,面對一百多封未讀郵件, 你每天接觸十來...
    一刀職場閱讀 302評論 0 0