註解全解析

註解全解析

  • 什麼是註解?html

  • 註解有什麼做用?java

  • 註解是怎麼幹活的?安全

  • 如何自定義註解?框架

什麼是註解

  • 註解即元數據,一種描述數據的數據,能夠說註解就是源代碼的元數據ide

  • Annotation是一種應用於類、方法、參數、變量、構造器及包聲明中的特殊修飾符函數

  • Annotation不能影響程序代碼的運行,不管增長、刪除註解,代碼都始終如一的執行工具

  • 元數據(metadata),數據的數據日誌

    • 元數據能夠用來建立文檔,跟蹤代碼的依賴性,執行編譯時格式檢查,代替已有的配置文件code

    • 元數據以標籤的形式存在於Java代碼中,描述的信息是類型安全的(內部字段有明確類型)orm

  • Annotation類型定義了Annotation的名字、類型成員默認值,一個Annotation類型能夠是一個特殊的java接口

註解有什麼做用

  • 使用XML描述元數據:XML是爲了分離代碼和配置而引入,但有時候咱們但願使用一些和代碼緊耦合的描述

  • Annotation出現以前,開發人員使用本身的方式定義元數據,如標記interfaces,註釋,transient等

  • Annotation給了一個統一的標準規範,在許多框架中與XML結合使用,平衡二者的利弊

註解是怎麼幹活的

  • 看源碼@Override註解,你可能會疑惑,它什麼都沒有作,那它是如何檢查在父類中有一個同名的函數

  • 強調:Annotation僅僅是元數據,和業務邏輯無關

  • Annotation並不直接對程序的語法產生做用,可是會提供一些程序以外的數據或者信息,影響工具或者類庫對程序的處理或者調用的方式,從而影響程序運行時的行爲

元註解

  • 元註解的做用就是負責註解其餘註解,meta-annotation類型

  • @Target:用於描述註解的使用範圍,即被描述的註解能夠用在什麼地方

    • ElementType.TYPE:用於描述類、接口或enum聲明

    • ElementType.FIELD:用於描述實例變量,包括enum常量

    • ElementType.METHOD:用於描述方法

    • ElementType.PARAMETER:用於描述參數

    • ElementType.CONSTRUCTOR:用於描述構造器

    • ElementType.LOCAL_VARIABLE:用於描述局部變量

    • ElementType.ANNOTATION_TYPE:用於描述註解類型,另外一個註釋

    • ElementType.PACKAGE:用於記錄Java文件的package信息

    • ElementType.TYPE_PARAMETER:能夠用在Type的聲明前

    • ElementType.TYPE_USE:能夠用在全部使用Type的地方

      • 初始化對象:String myString = new @NotNull String();

      • 使用 throws 表達式:public void validateValues() throws @Critical ValidationFailedException{ }

  • @Retention:表示須要在什麼級別保存該註釋信息,用於描述註解的生命週期,即被描述的註解在什麼範圍內有效

    • RetentionPolicy.SOURCE:在編譯階段丟棄,編譯以後就再也不有任何意義,如@Override@SuppressWarnings

    • RetentionPolicy.CLASS:在類加載的時候丟棄,在字節碼文件的處理中使用,註解默認使用這種方式

    • RetentionPolicy.RUNTIME:不會丟棄,運行時也保留該註解,可使用反射機制讀取該註解信息,自定義註解一般使用這種方式

  • @Documented:註解是否包含在JavaDoc中

  • @Inherited:是一個標記註解,若是使用了該註解修飾的annotation註解的class,會被做用於該class的子類

如何自定義註解

  • 自定義註解:@Todo

package com.adagio.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定義註解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo {
    
    public enum Priority{LOW, MEDIUM, HIGH}
    
    public enum Status{STARTED, NOT, NOT_STARTED}
    
    String author() default "Yash";
    
    Priority priority() default Priority.LOW;
    
    Status status() default Status.NOT_STARTED;

}
  • 若是註解只有一個屬性,能夠直接命名爲"value",使用時無需在標明屬性名

package com.adagio.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
    
    String value();
    
}
  • 註解元素必須有肯定的值,能夠在定義註解的默認值中指定,也能夠在使用註解時指定

  • 使用反射讀取註解信息:BusinessLogic

package com.adagio.demo;

import java.lang.reflect.Method;

public class BusinessLogic {
    
    @Todo(priority = Todo.Priority.MEDIUM, author = "Yashwant", status = Todo.Status.STARTED)
    public void incompleteMethod(){
        
    }
    
    @Author("Yashwant")
    public void someMethod(){
        
    }

    public void readAnnotationInfo(){
        Class<BusinessLogic> businessLogicClass = BusinessLogic.class;
        for(Method method : businessLogicClass.getMethods()){
            Todo todoAnnotation = method.getAnnotation(Todo.class);
            if(todoAnnotation != null){
                System.out.println("Method Name:" + method.getName());
                System.out.println("Author:" + todoAnnotation.author());
                System.out.println("Priority:" + todoAnnotation.priority());
                System.out.println("Status:" + todoAnnotation.author());
            }
        }
    }
    
    public static void main(String[] args) {
        System.out.println("開始讀取》》》》");
        BusinessLogic b = new BusinessLogic();
        b.readAnnotationInfo();
        System.out.println("讀取結束》》》》");
    }
}

註解用例

  • 註解的功能很強大,Spring和Hibernate這些框架在日誌和有效性中大量使用了註解功能

  • 註解能夠應用在使用標記接口的地方,不一樣的是標記的接口用來定義完整的類,但你能夠爲單個方法定義註解,如將一個方法暴露爲服務

  • servlet3.0引入的新註解,和servlet安全相關的註解:

    • HandlesTypes 該註解用來表示一組傳遞給ServletContainerInitializer的應用類

    • HttpConstraint 該註解表明全部HTTP方法的應用請求的安全約束

    • HttpMethodConstraint 指明不一樣類型請求的安全約束

    • MultipartConfig 該註解標註在Serblet上,表處理請求MIME類型是multipart/form-data

    • ServletSecurity 該註解標註在Servlet繼承類上,強制該HTTP協議請求遵循安全約束

    • WebFilter 該註解用來聲明一個Servlet過濾器

    • WebInitParam 該註解用來聲明Servlet或是過濾器中的初始化參數,一般配合@WebServlet或 @WebFilter使用

    • WebListener 該註解爲Web應用程序上下文中不一樣類型的事件聲明監聽器

    • WebServlet 該註解用來聲明一個Servlet的配置

參考文檔:
http://www.importnew.com/1029...
http://www.cnblogs.com/peida/...
http://www.cnblogs.com/peida/...
https://www.ibm.com/developer...

相關文章
相關標籤/搜索