摘要:注解有以下幾個(gè)知識(shí)點(diǎn)元數(shù)據(jù)注解的分類內(nèi)置注解自定義注解注解處理器本文先介紹前面?zhèn)€知識(shí)點(diǎn)元數(shù)據(jù)注解的分類內(nèi)置注解自定義注解。注解相當(dāng)于是一種嵌入在程序中的元數(shù)據(jù),可以使用注解解析工具或編譯器對(duì)其進(jìn)行解析,也可以指定注解在編譯期或運(yùn)行期有效。
大家好,我是樂字節(jié)的小樂,上次說(shuō)過(guò)了Java多態(tài)的6大特性|樂字節(jié),接下來(lái)我們來(lái)看看Java編程里的注解。
Java注解有以下幾個(gè)知識(shí)點(diǎn):
元數(shù)據(jù)
注解的分類
內(nèi)置注解
自定義注解
注解處理器
Servlet3.0
本文先介紹前面4個(gè)知識(shí)點(diǎn):元數(shù)據(jù)、注解的分類、內(nèi)置注解、自定義注解。
一、注解簡(jiǎn)介注解是Java 1.5引入的,目前已被廣泛應(yīng)用于各種Java框架,如Hibernate,Jersey,
Spring。注解相當(dāng)于是一種嵌入在程序中的元數(shù)據(jù),可以使用注解解析工具或編譯器對(duì)
其進(jìn)行解析,也可以指定注解在編譯期或運(yùn)行期有效。
在注解誕生之前,程序的元數(shù)據(jù)存在的形式僅限于java注釋或javadoc,但注解可以提
供更多功能,它不僅包含元數(shù)據(jù),還能作用于運(yùn)行期,注解解析器能夠使用注解決定處
理流程。
Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)
(metadata)的途徑和方法。Annotation是一個(gè)接口,程序可以通過(guò)反射來(lái)獲取指定
程序元素的Annotation對(duì)象,然后通過(guò)Annotation對(duì)象來(lái)獲取注解里面的元數(shù)據(jù)。
注解API非常強(qiáng)大,被廣泛應(yīng)用于各種Java框架,如Spring,Hibernate,JUnit。
二、 元數(shù)據(jù)metadata元數(shù)據(jù)從metadata一詞譯來(lái),就是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”的意思,即描述數(shù)據(jù)的結(jié)構(gòu)信息。元數(shù)據(jù)的功能作用有很多,比如:你可能用過(guò)Javadoc的注釋自動(dòng)生成文檔。這就是元數(shù)據(jù)功能的一種??偟膩?lái)說(shuō),元數(shù)據(jù)可以用來(lái)創(chuàng)建文檔,跟蹤代碼的依賴性,執(zhí)行編譯時(shí)格式檢查,代替已有的配置文件。
在Java中元數(shù)據(jù)以標(biāo)簽的形式存在于Java代碼中,元數(shù)據(jù)標(biāo)簽的存在并不影響程序代碼的編譯和執(zhí)行,被用來(lái)生成其它的文件或只在運(yùn)行時(shí)知道被運(yùn)行代碼的描述信息。
其作用如下:
①生成文檔:這是最常見的,也是java 最早提供的注解。常用的有@param @return 等;
② 跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能。常見的是spring 2.5 開始的基于注解配置。作用就是減少配置。現(xiàn)在的框架基本都使用了這種配置來(lái)減少配置文件的數(shù)量。;
③在編譯時(shí)進(jìn)行格式檢查。如@override 放在方法前,如果你這個(gè)方法并不是覆蓋了超類方法,則編譯時(shí)就能檢查出。
三、 注解的分類根據(jù)注解參數(shù)的個(gè)數(shù):
1)、標(biāo)記注解:一個(gè)沒有成員定義的Annotation類型被稱為標(biāo)記注解。
2)、單值注解:只有一個(gè)值
3)、完整注解:擁有多個(gè)值
根據(jù)注解使用方法和用途:
1)、JDK內(nèi)置系統(tǒng)注解
2)、元注解
3)、自定義注解
四、 內(nèi)置注解JavaSE中內(nèi)置三個(gè)標(biāo)準(zhǔn)注解,定義在java.lang中:
1、@Override限定重寫父類方法,若想要重寫父類的一個(gè)方法時(shí),需要使用該注解告知編譯器我們正在重寫一個(gè)方法。如此一來(lái),當(dāng)父類的方法被刪除或修改了,編譯器會(huì)提示錯(cuò)誤信息;或者該方法不是重寫也會(huì)提示錯(cuò)誤。
public interface Car { void run(); } class QQ implements Car{ @Override public void run() {} } class Bmw implements Car{ @Override void run() {} }
QQ 類編譯不會(huì)有任何問(wèn)題,Bmw類在編譯的時(shí)候會(huì)提示相應(yīng)的錯(cuò)誤。父類中省略了public abstract修飾符。@Override注解只能用于方法,不能用于其他程序元素。
2、@Deprecated標(biāo)記已過(guò)時(shí),當(dāng)我們想要讓編譯器知道一個(gè)方法已經(jīng)被棄用(deprecate)時(shí),應(yīng)該使用這個(gè)注解。Java推薦在javadoc中提供信息,告知用戶為什么這個(gè)方法被棄用了,以及替代方法是什么;
/** * Deprecated -->該方法過(guò)時(shí)(有更好的解決方案) * @author Administrator */ public class TestDeprecated { @Deprecated public int test(){ System.out.println("TestDeprecated.test()"); return 0; } public void test(int a){ System.out.println("TestDeprecated.test(int)"); } }3、@SuppressWarnings
抑制編譯器警告,該注解僅僅告知編譯器,忽略它們產(chǎn)生了特殊警告。如:在java泛型中使用原始類型。其保持性策略(retention policy)是SOURCE,在編譯器中將被丟棄。
五、 自定義注解 1、簡(jiǎn)單入門@interface:用來(lái)聲明一個(gè)注解。注解類里的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型??梢酝ㄟ^(guò)default來(lái)聲明參數(shù)的默認(rèn)值。
@interface Simple{
//這里定義了一個(gè)空的注解,它能干什么呢?我也不知道,但他能用。后面有補(bǔ)充
}
/** * SuppressWarnings 壓制警告 * @author Administrator */ public class TestSuppressWarnings { public static void main(String[] args) { @SuppressWarnings("unused") List2、元注解list =new ArrayList (); } @SuppressWarnings("rawtypes") //沒有定義范型 public static List test(){ return new ArrayList(); } }
元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類型,它們被用來(lái)提供對(duì)其它 annotation類型作說(shuō)明。Java5.0定義的元注解有四個(gè),
這些類型和它們所支持的類在java.lang.annotation包中可以找到。
@Target
用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)。表示支持注解的程序元素的種類,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么該注解就可以使用在任何程序元素之上。
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
此時(shí)在空注解中加入@Target元注解如:
//此注解只能用在方法上
@Target(ElementType.METHOD)
@interface TestMethod {}
@Retention
表示需要在什么級(jí)別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)表示注解類型保留時(shí)間的長(zhǎng)短。
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
此時(shí)在上述注解中加入@Retention元注解如:
// 此注解可以用于注解類、接口(包括注解類型) 或enum聲明
@Target(ElementType.TYPE)
//該注解運(yùn)行時(shí)有效。注解處理器可以通過(guò)反射,獲取到該注解的屬性值,從而去做一些運(yùn)行時(shí)的邏輯處理
@Retention(RetentionPolicy.RUNTIME)
@interface TestRn{
}
@Documented
表示使用該注解的元素應(yīng)被javadoc或類似工具文檔化,它應(yīng)用于類型聲明,類型聲明的注解會(huì)影響客戶端對(duì)注解元素的使用。如果一個(gè)類型聲明添加了Documented注解,那么它的注解會(huì)成為被注解元素的公共API的一部分,@Documented是一個(gè)標(biāo)記注解。
//可以被例如javadoc此類的工具文檔化
@Documented
@interface TestDoc{
}
@Inherited
表示一個(gè)注解類型會(huì)被自動(dòng)繼承,如果用戶在類聲明的時(shí)候查詢注解類型,同時(shí)類聲明中也沒有這個(gè)類型的注解,那么注解類型會(huì)自動(dòng)查詢?cè)擃惖母割?,這個(gè)過(guò)程將會(huì)不停地重復(fù),直到該類型的注解被找到為止,或是到達(dá)類結(jié)構(gòu)的頂層(Object)。
//被子類繼承的注解
@Inherited
@interface TestInheri{}
使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,由編譯程序自動(dòng)完成其他細(xì)節(jié)。在定義注解時(shí),不能繼承其他的注解或接口。
⑴定義注解格式:
@interface用來(lái)聲明一個(gè)注解,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)??梢酝ㄟ^(guò)default來(lái)聲明參數(shù)的默認(rèn)值。
public @interface 注解名{定義體s}
⑵注解參數(shù)(即方法)
注解里面的每一個(gè)方法實(shí)際上就是聲明了一個(gè)配置參數(shù),其規(guī)則如下:
①修飾符
只能用public或默認(rèn)(default)這兩個(gè)訪問(wèn)權(quán)修飾 ,默認(rèn)為default
②類型
注解參數(shù)只支持以下數(shù)據(jù)類型:
基本數(shù)據(jù)類型(int,float,boolean,byte,double,char,long,short);
String類型;
Class類型;
enum類型;
Annotation類型;
以上所有類型的數(shù)組
③命名
對(duì)取名沒有要求,如果只有一個(gè)參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號(hào)。
④參數(shù)
注解中的方法不能存在參數(shù)
⑤默認(rèn)值
可以包含默認(rèn)值,使用default來(lái)聲明默認(rèn)值。
⑶實(shí)例如下
/* * 碼農(nóng)定義注解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface Programmer{ String value() default "馬云"; } /** * 碼農(nóng)類型注解 * @author peida */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface ProgrammerType { /** * 類型枚舉 程序猿 射雞師 */ public enum CoderType{MONKEYS,LION,CHOOK}; /** * 顏色屬性 */ CoderType type() default CoderType.MONKEYS; } /** * 碼農(nóng)制造廠 * @author Administrator */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface ProgrammerProductor { /** * 廠家編號(hào) * @return */ public int id() default -1; /** * 廠家名稱 * @return */ public String name() default "shsxt"; /** * 廠家地址 * @return */ public String address() default "上海"; } /** * 注解使用 */ class Coder{ @Programmer("老裴") private String coderName; @ProgrammerType(type=CoderType.MONKEYS) private String coderType; @ProgrammerProductor(id=1,name="程序猿樂園",address="榮樂東路") private String coderProductor; public String getCoderName() { return coderName; } public void setCoderName(String coderName) { this.coderName = coderName; } public String getCoderType() { return coderType; } public void setCoderType(String coderType) { this.coderType = coderType; } public String getCoderProductor() { return coderProductor; } public void setCoderProductor(String coderProductor) { this.coderProductor = coderProductor; } }
樂字節(jié)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75594.html
摘要:擴(kuò)展了反射機(jī)制的,以幫助程序員快速的構(gòu)造自定義注解處理器。返回該程序元素上存在的所有注解。在中,可以使用注解將一個(gè)繼承于的類標(biāo)注為可以處理用戶請(qǐng)求的。 大家好,我是樂字節(jié)的小樂,上次給大家?guī)?lái)了Java注解-元數(shù)據(jù)、注解分類、內(nèi)置注解和自定義注解|樂字節(jié),這次接著往下講注解處理器和servlet3.0showImg(https://segmentfault.com/img/bVbvBP...
摘要:項(xiàng)目介紹日志脫敏是常見的安全需求。常見的脫敏內(nèi)置方案。支持用戶自定義注解。自定義注解導(dǎo)入自定義注解新增功能。策略優(yōu)先級(jí)優(yōu)先生效,然后是系統(tǒng)內(nèi)置注解,最后是用戶自定義注解。讓這些的密碼不進(jìn)行脫敏定義測(cè)試對(duì)象定義一個(gè)使用自定義注解的對(duì)象。 項(xiàng)目介紹 日志脫敏是常見的安全需求。普通的基于工具類方法的方式,對(duì)代碼的入侵性太強(qiáng)。編寫起來(lái)又特別麻煩。 本項(xiàng)目提供基于注解的方式,并且內(nèi)置了常見的脫敏...
摘要:前言注解就是提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)的途徑和方法。注解是一個(gè)接口,程序可以通過(guò)反射來(lái)獲取指定程序元素的對(duì)象,然后通過(guò)對(duì)象來(lái)獲取注解里面的元數(shù)據(jù)。注解是及以后版本引入的。綜上所述元數(shù)據(jù)以標(biāo)簽的形式存在于代碼中。 前言 Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解...
摘要:例子首先來(lái)看一個(gè)例子這里用了目的是告訴編譯器這個(gè)方法重寫了父類的方法如果編譯器發(fā)現(xiàn)父類中沒有這個(gè)方法就會(huì)報(bào)錯(cuò)這個(gè)注解的作用大抵是防止手滑寫錯(cuò)方法同時(shí)增強(qiáng)了程序的可讀性這里需要指出一點(diǎn)去掉并不會(huì)影響程序的執(zhí)行只是起到標(biāo)記的作用找到的實(shí)現(xiàn)關(guān)注點(diǎn) 1. 例子 首先來(lái)看一個(gè)例子: @Override public String toString() { return xxxxx; ...
摘要:注解之后新特性對(duì)元素進(jìn)行說(shuō)明包類字段方法局部變量,方法參數(shù)注解與注釋的區(qū)別注解用特定格式名稱說(shuō)明程序,給計(jì)算機(jī)看的注釋用文字說(shuō)明程序,給程序員看的作用分類編寫文檔的注解生成文檔寫在注釋中代碼分析的注解對(duì)代碼進(jìn)行分析反射編譯檢查的注解進(jìn)行編譯 注解 1、JDK 1.5之后新特性2、對(duì)元素進(jìn)行說(shuō)明(包、類、字段、方法、局部變量,方法參數(shù)) 注解與注釋的區(qū)別 注解:用特定格式名稱說(shuō)明程序,給...
閱讀 2316·2021-11-22 13:54
閱讀 3434·2019-08-29 12:25
閱讀 3512·2019-08-28 18:29
閱讀 3657·2019-08-26 13:40
閱讀 3325·2019-08-26 13:32
閱讀 1045·2019-08-26 11:44
閱讀 2293·2019-08-23 17:04
閱讀 3023·2019-08-23 17:02