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