Java注解

Java注解

Spring中用到了Java注解,可Java注解究竟是怎么一回事呢领迈?

什么是注解

注解用一個(gè)詞來描述就是元數(shù)據(jù)彻磁,即一種描述數(shù)據(jù)的數(shù)據(jù)。比如我們經(jīng)常使用@Override注解來標(biāo)注被重寫的方法狸捅,可是衷蜓,即使我們不使用注解標(biāo)注,程序也可以正確執(zhí)行呀尘喝,那為什么還要注解呢磁浇。
事實(shí)上,@Override告訴編譯器這個(gè)方法是一個(gè)重寫方法(描述方法的元數(shù)據(jù))朽褪,如果父類中不存在該方法置吓,編譯器便會報(bào)錯(cuò),提示該方法沒有重寫父類中的方法缔赠。如果我不小心拼寫錯(cuò)誤衍锚,例如將toString()寫成了toStrring(){double r},而且我也沒有使用@Override注解嗤堰,那程序依然能編譯運(yùn)行戴质。但運(yùn)行結(jié)果會和我期望的大不相同。現(xiàn)在我們了解了什么是注解,并且使用注解有助于閱讀程序告匠。
在項(xiàng)目配置方面戈抄,注解會于代碼相連。假如你想為應(yīng)用設(shè)置很多的常量或參數(shù)后专,這種情況下划鸽,XML是一個(gè)很好的選擇,因?yàn)樗粫囟ǖ拇a相連行贪。如果你想把某個(gè)方法聲明為服務(wù)漾稀,那么使用Annotation會更好一些,因?yàn)檫@種情況下需要注解和方法緊密耦合起來建瘫,開發(fā)人員也必須認(rèn)識到這點(diǎn)崭捍。

Java SE5內(nèi)置的三種標(biāo)準(zhǔn)注解

@Override重寫
@Deprecated為它的元素編譯發(fā)出警告,表示這是不贊成使用啰脚,被棄用的代碼
@SuppressWarning關(guān)閉不當(dāng)編譯警告信息

創(chuàng)建新注解

Java提供了4種注解殷蛇,負(fù)責(zé)創(chuàng)建新注解

  • @Documented 將注解包含在JavaDoc中
  • @Retention 表示需要在什么級別保存該注解信息¢吓ǎ可選的RetentionPolicy參數(shù)包括:
    SOURCE:注解將被編譯器丟棄
    CLASS:注解在class文件中可用粒梦,但會被VM丟棄
    RUNTIME:VM將在運(yùn)行期間保留注解,因此可以通過反射機(jī)制讀取注解的信息荸实。
  • @Target 注解用于什么地方
    可能的ElementType參數(shù)有:
    CONSTRUCTOR:構(gòu)造器的聲明
    FIELD:域聲明(包括enum實(shí)例)
    LOCAL_VARIABLE:局部變量聲明
    METHOD:方法聲明
    PACKAGE:包聲明
    PARAMETER:參數(shù)聲明
    TYPE:類匀们、接口(包括注解類型)或enum聲明
  • @Inherited 允許子類繼承該注解

Example

  • 定義一個(gè)注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
      public String id();
      public String description() default "no description";
 }

在注解中一般會有一些元素以表示某些值。注解的元素看起來就像接口的方法准给,唯一的區(qū)別在于可以為其制定默認(rèn)值泄朴。沒有元素的注解稱為標(biāo)記注解
注解的可用的類型包括以下幾種:所有基本類型、String露氮、Class祖灰、enum、Annotation畔规、以上類型的數(shù)組形式局扶。元素不能有不確定的值,即要么有默認(rèn)值叁扫,要么在使用注解的時(shí)候提供元素的值三妈。而且元素不能使用null作為默認(rèn)值。注解在只有一個(gè)元素且該元素的名稱是value的情況下莫绣,在使用注解的時(shí)候可以省略“value=”沈跨,直接寫需要的值即可。

  • 使用注解
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();
     }
 }
  • 對注解進(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);
     }
 }
 ----------------------------------
運(yùn)行結(jié)果
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

參考文獻(xiàn)

java中注解的使用與實(shí)例(一)
Java中的注解是如何工作的兔综?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饿凛,一起剝皮案震驚了整個(gè)濱河市狞玛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涧窒,老刑警劉巖心肪,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纠吴,居然都是意外死亡硬鞍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門戴已,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固该,“玉大人,你說我怎么就攤上這事糖儡》セ担” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵握联,是天一觀的道長桦沉。 經(jīng)常有香客問我,道長金闽,這世上最難降的妖魔是什么纯露? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮代芜,結(jié)果婚禮上埠褪,老公的妹妹穿的比我還像新娘。我一直安慰自己挤庇,他們只是感情好组橄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罚随,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羽资。 梳的紋絲不亂的頭發(fā)上淘菩,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音屠升,去河邊找鬼潮改。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腹暖,可吹牛的內(nèi)容都是我干的汇在。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼脏答,長吁一口氣:“原來是場噩夢啊……” “哼糕殉!你這毒婦竟也來了亩鬼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阿蝶,失蹤者是張志新(化名)和其女友劉穎雳锋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羡洁,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玷过,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筑煮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛蚊。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖真仲,靈堂內(nèi)的尸體忽然破棺而出袋马,到底是詐尸還是另有隱情,我是刑警寧澤袒餐,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布飞蛹,位于F島的核電站,受9級特大地震影響灸眼,放射性物質(zhì)發(fā)生泄漏卧檐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一焰宣、第九天 我趴在偏房一處隱蔽的房頂上張望霉囚。 院中可真熱鬧,春花似錦匕积、人聲如沸盈罐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盅粪。三九已至,卻和暖如春悄蕾,著一層夾襖步出監(jiān)牢的瞬間票顾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工帆调, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奠骄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓番刊,卻偏偏與公主長得像含鳞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子芹务,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蝉绷,服務(wù)發(fā)現(xiàn)鸭廷,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 內(nèi)容概要 Annotation的概念 Annotation的作用 Annotation的分類 系統(tǒng)內(nèi)置注解 元注解...
    DevinZhang閱讀 4,157評論 0 28
  • 注解 創(chuàng)建注解 下面代碼創(chuàng)建了一個(gè)名為MyAnno的注解潜必,有兩個(gè)成員str和val靴姿。@Retention(…)注解...
    kylinxiang閱讀 3,624評論 0 2
  • 同時(shí)發(fā)布于 知乎 Java 注解 1.注解的由來 在引入注解之前,在不同類型的應(yīng)用程序使用XML作為標(biāo)準(zhǔn)的代碼配置...
    踐行者閱讀 975評論 0 0
  • 硬筆6張 畫10張 字10張 弟子規(guī)一張 布面一幅 剪紙另算大5小8
    GreatQ閱讀 125評論 0 0