什麼是註解?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...