摘要:注解全解析什么是注解注解有什么作用注解是怎么干活的如何自定義注解什么是注解注解即元數(shù)據(jù),一種描述數(shù)據(jù)的數(shù)據(jù),可以說注解就是源代碼的元數(shù)據(jù)是一種應用于類方法參數(shù)變量構(gòu)造器及包聲明中的特殊修飾符不能影響程序代碼的運行,無論增加刪除注解,代碼都始
注解全解析
什么是注解?
注解有什么作用?
注解是怎么干活的?
如何自定義注解?
什么是注解注解即元數(shù)據(jù),一種描述數(shù)據(jù)的數(shù)據(jù),可以說注解就是源代碼的元數(shù)據(jù)
Annotation是一種應用于類、方法、參數(shù)、變量、構(gòu)造器及包聲明中的特殊修飾符
Annotation不能影響程序代碼的運行,無論增加、刪除注解,代碼都始終如一的執(zhí)行
元數(shù)據(jù)(metadata),數(shù)據(jù)的數(shù)據(jù)
元數(shù)據(jù)可以用來創(chuàng)建文檔,跟蹤代碼的依賴性,執(zhí)行編譯時格式檢查,代替已有的配置文件
元數(shù)據(jù)以標簽的形式存在于Java代碼中,描述的信息是類型安全的(內(nèi)部字段有明確類型)
Annotation類型定義了Annotation的名字、類型成員默認值,一個Annotation類型可以是一個特殊的java接口
注解有什么作用使用XML描述元數(shù)據(jù):XML是為了分離代碼和配置而引入,但有時候我們希望使用一些和代碼緊耦合的描述
Annotation出現(xiàn)之前,開發(fā)人員使用自己的方式定義元數(shù)據(jù),如標記interfaces,注釋,transient等
Annotation給了一個統(tǒng)一的標準規(guī)范,在許多框架中與XML結(jié)合使用,平衡兩者的利弊
注解是怎么干活的看源碼@Override注解,你可能會疑惑,它什么都沒有做,那它是如何檢查在父類中有一個同名的函數(shù)
強調(diào):Annotation僅僅是元數(shù)據(jù),和業(yè)務邏輯無關(guān)
Annotation并不直接對程序的語法產(chǎn)生作用,但是會提供一些程序之外的數(shù)據(jù)或者信息,影響工具或者類庫對程序的處理或者調(diào)用的方式,從而影響程序運行時的行為
元注解元注解的作用就是負責注解其他注解,meta-annotation類型
@Target:用于描述注解的使用范圍,即被描述的注解可以用在什么地方
ElementType.TYPE:用于描述類、接口或enum聲明
ElementType.FIELD:用于描述實例變量,包括enum常量
ElementType.METHOD:用于描述方法
ElementType.PARAMETER:用于描述參數(shù)
ElementType.CONSTRUCTOR:用于描述構(gòu)造器
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:表示需要在什么級別保存該注釋信息,用于描述注解的生命周期,即被描述的注解在什么范圍內(nèi)有效
RetentionPolicy.SOURCE:在編譯階段丟棄,編譯之后就不再有任何意義,如@Override@SuppressWarnings
RetentionPolicy.CLASS:在類加載的時候丟棄,在字節(jié)碼文件的處理中使用,注解默認使用這種方式
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注解用例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("讀取結(jié)束》》》》"); } }
注解的功能很強大,Spring和Hibernate這些框架在日志和有效性中大量使用了注解功能
注解可以應用在使用標記接口的地方,不同的是標記的接口用來定義完整的類,但你可以為單個方法定義注解,如將一個方法暴露為服務
servlet3.0引入的新注解,和servlet安全相關(guān)的注解:
HandlesTypes 該注解用來表示一組傳遞給ServletContainerInitializer的應用類
HttpConstraint 該注解代表所有HTTP方法的應用請求的安全約束
HttpMethodConstraint 指明不同類型請求的安全約束
MultipartConfig 該注解標注在Serblet上,表處理請求MIME類型是multipart/form-data
ServletSecurity 該注解標注在Servlet繼承類上,強制該HTTP協(xié)議請求遵循安全約束
WebFilter 該注解用來聲明一個Servlet過濾器
WebInitParam 該注解用來聲明Servlet或是過濾器中的初始化參數(shù),通常配合@WebServlet或 @WebFilter使用
WebListener 該注解為Web應用程序上下文中不同類型的事件聲明監(jiān)聽器
WebServlet 該注解用來聲明一個Servlet的配置
參考文檔:
http://www.importnew.com/1029...
http://www.cnblogs.com/peida/...
http://www.cnblogs.com/peida/...
https://www.ibm.com/developer...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67426.html
摘要:反射可以解決在編譯時無法預知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。此處的對應種基本類型,如果該成員變量的類型是引用類型的,則去掉部分將對象的該成員變量設(shè)置為值。 反射可以解決在編譯時無法預知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。 在兩個人協(xié)作開發(fā)時,你只要知道對方的類名就可以進行初步的開發(fā)了。 獲取類對象 ...
摘要:事件只能攜帶一個的。例如在上述代碼示例中的將所有使用發(fā)布事件的地方,全部修改為使用的方法。是否能夠編寫腳本或者自動化工具,自動化的完成重構(gòu)工作。實施方案使用注解解析自動生成文件我們都知道,是通過注解來實現(xiàn)的。 歡迎大家前往騰訊云社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 作者:吳濤 導語:EventBus 已經(jīng)火了很長一段時間了。最近我們項目決定引入EventBus,替換我們播放器現(xiàn)在的事...
摘要:常規(guī)的配置讓開發(fā)人員將更多的經(jīng)歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規(guī)的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規(guī)的配置讓開發(fā)人員將更多的經(jīng)歷耗費在了配置文件上。而這些配置都是一些固定模...
摘要:常規(guī)的配置讓開發(fā)人員將更多的經(jīng)歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規(guī)的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規(guī)的配置讓開發(fā)人員將更多的經(jīng)歷耗費在了配置文件上。而這些配置都是一些固定模...
閱讀 2682·2021-11-16 11:53
閱讀 2744·2021-07-26 23:38
閱讀 2076·2019-08-30 15:55
閱讀 1758·2019-08-30 13:21
閱讀 3671·2019-08-29 17:26
閱讀 3313·2019-08-29 13:20
閱讀 880·2019-08-29 12:20
閱讀 3198·2019-08-26 10:21