Java注解基本原理

注解目前非常的流行,很多主流框架都支持注解试躏,而且自己編寫代碼的時(shí)候也會(huì)盡量的去用注解,一時(shí)方便设褐,而是代碼更加簡(jiǎn)潔颠蕴。

注解的語法比較簡(jiǎn)單,除了@符號(hào)的使用之外助析,它基本與Java固有語法一致犀被。Java SE5內(nèi)置了三種標(biāo)準(zhǔn)注解:

@Override,表示當(dāng)前的方法定義將覆蓋超類中的方法外冀。

@Deprecated寡键,使用了注解為它的元素編譯器將發(fā)出警告,因?yàn)樽⒔釦Deprecated是不贊成使用的代碼雪隧,被棄用的代碼西轩。

@SuppressWarnings员舵,關(guān)閉不當(dāng)編譯器警告信息。

上面這三個(gè)注解多少我們都會(huì)在寫代碼的時(shí)候遇到藕畔。Java還提供了4中注解马僻,專門負(fù)責(zé)新注解的創(chuàng)建。

注解 描述
@Target 表示該注解可以用于什么地方注服,可能的ElementType參數(shù)有:CONSTRUCTOR:構(gòu)造器的聲明韭邓、FIELD:域聲明(包括enum實(shí)例)、LOCAL_VARIABLE:局部變量聲明祠汇、METHOD:方法聲明仍秤、PACKAGE:包聲明、PARAMETER:參數(shù)聲明可很、TYPE:類诗力、接口(包括注解類型)或enum聲明
@Retention 表示需要在什么級(jí)別保存該注解信息∥铱伲可選的RetentionPolicy參數(shù)包括:SOURCE:注解將被編譯器丟棄苇本、CLASS:注解在class文件中可用,但會(huì)被VM丟棄菜拓、RUNTIME:VM將在運(yùn)行期間保留注解瓣窄,因此可以通過反射機(jī)制讀取注解的信息。
@Document 將注解包含在Javadoc中
@Inherited 允許子類繼承父類中的注解

定義一個(gè)注解的方式:

@Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Test {
  
}

除了@符號(hào)纳鼎,注解很像是一個(gè)接口俺夕。定義注解的時(shí)候需要用到元注解,上面用到了@Target和@RetentionPolicy贱鄙,它們的含義在上面的表格中已近給出劝贸。

在注解中一般會(huì)有一些元素以表示某些值。注解的元素看起來就像接口的方法逗宁,唯一的區(qū)別在于可以為其制定默認(rèn)值映九。沒有元素的注解稱為標(biāo)記注解,上面的@Test就是一個(gè)標(biāo)記注解瞎颗。

注解的可用的類型包括以下幾種:所有基本類型件甥、String、Class哼拔、enum引有、Annotation、以上類型的數(shù)組形式倦逐。元素不能有不確定的值轿曙,即要么有默認(rèn)值,要么在使用注解的時(shí)候提供元素的值。而且元素不能使用null作為默認(rèn)值导帝。注解在只有一個(gè)元素且該元素的名稱是value的情況下,在使用注解的時(shí)候可以省略“value=”穿铆,直接寫需要的值即可您单。

下面看一個(gè)定義了元素的注解。

@Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface UseCase {
      public String id();
      public String description() default "no description";
 }

定義了注解荞雏,必然要去使用注解虐秦。

 public class PasswordUtils {
       @UseCase(id = 47, description = "Passwords must contain at least one numeric")
       public boolean validatePassword(String password) {
           return (password.matches("\\w*\\d\\w*"));
       }
   
       @UseCase(id = 48)
       public String encryptPassword(String password) {
           return new StringBuilder(password).reverse().toString();
      }
  }

使用注解最主要的部分在于對(duì)注解的處理,那么就會(huì)涉及到注解處理器凤优。

從原理上講悦陋,注解處理器就是通過反射機(jī)制獲取被檢查方法上的注解信息,然后根據(jù)注解元素的值進(jìn)行特定的處理筑辨。

public static void main(String[] args) {
     List<Integer> useCases = new ArrayList<Integer>();
     Collections.addAll(useCases, 47, 48, 49, 50);
     trackUseCases(useCases, PasswordUtils.class);
 }

 public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
     for (Method m : cl.getDeclaredMethods()) {
         UseCase uc = m.getAnnotation(UseCase.class);
         if (uc != null) {
             System.out.println("Found Use Case:" + uc.id() + " "
                         + uc.description());
             useCases.remove(new Integer(uc.id()));
         }
     }
     for (int i : useCases) {
         System.out.println("Warning: Missing use case-" + i);
     }
 }

Found Use Case:47 Passwords must contain at least one numeric

Found Use Case:48 no description

Warning: Missing use case-49

Warning: Missing use case-50

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俺驶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棍辕,更是在濱河造成了極大的恐慌暮现,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楚昭,死亡現(xiàn)場(chǎng)離奇詭異栖袋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抚太,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門塘幅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尿贫,你說我怎么就攤上這事电媳。” “怎么了帅霜?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵匆背,是天一觀的道長。 經(jīng)常有香客問我身冀,道長钝尸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任搂根,我火速辦了婚禮珍促,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剩愧。我一直安慰自己猪叙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穴翩,像睡著了一般犬第。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芒帕,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天歉嗓,我揣著相機(jī)與錄音,去河邊找鬼背蟆。 笑死鉴分,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的带膀。 我是一名探鬼主播志珍,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼垛叨!你這毒婦竟也來了伦糯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤点额,失蹤者是張志新(化名)和其女友劉穎舔株,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體还棱,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡载慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珍手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片办铡。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琳要,靈堂內(nèi)的尸體忽然破棺而出寡具,到底是詐尸還是另有隱情,我是刑警寧澤稚补,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布童叠,位于F島的核電站,受9級(jí)特大地震影響课幕,放射性物質(zhì)發(fā)生泄漏厦坛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一乍惊、第九天 我趴在偏房一處隱蔽的房頂上張望杜秸。 院中可真熱鬧,春花似錦润绎、人聲如沸撬碟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呢蛤。三九已至惶傻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間其障,已是汗流浹背达罗。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留静秆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓巡李,卻偏偏與公主長得像抚笔,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侨拦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,699評(píng)論 0 3
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 殊橙? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評(píng)論 0 4
  • 內(nèi)容概要 Annotation的概念 Annotation的作用 Annotation的分類 系統(tǒng)內(nèi)置注解 元注解...
    DevinZhang閱讀 4,170評(píng)論 0 28
  • 一狱从、概念 ??Annotation(注解)就是Java提供了一種源程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)(metad...
    從菜鳥到老菜鳥閱讀 2,108評(píng)論 0 2
  • 我覺得喜歡一個(gè)人是特別容易的膨蛮,但放棄一個(gè)人是不容易的。喜歡一個(gè)人只要四秒但放棄一個(gè)人可能要一生 我最討厭的就是想放...
    Devil_4626閱讀 116評(píng)論 0 1