注解

注解(也被稱為元數(shù)據(jù))為我們?cè)诖a中添加信息提供了一些形式化的方法愕难,是我們?cè)谏院蟮哪硞€(gè)時(shí)刻早龟,可以非常方便的使用這些數(shù)據(jù)

注解的語法比較簡(jiǎn)單,除了@符號(hào)使用之外猫缭,他與java語法一致葱弟,javaSE5內(nèi)置了三種,java.lang中的注解

  • @Override 表示當(dāng)前的方法定義將覆蓋超類中的方法
  • @Deprecated 如果程序員使用了注解為他的元素猜丹,那么編譯器將發(fā)出警告信息
  • @SuppressWarnings 關(guān)閉不當(dāng)?shù)木幾g器警告信息
一. 基本語法
 import org.junit.Test;
public class TestTable {
    public void excute(){
        System.out.println("");
    }
    @Test
    public void testExecute(){
    }
}

可以看出被注解的方法與其他方法并無區(qū)別芝加,注解@Test可以與任何修飾符作用于方法

二. 定義注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //表示注解應(yīng)用于方法
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
}

可以看出注解的定義很像接口的定義,他與java接口一樣會(huì)編譯成class文件,定義注解時(shí),會(huì)需要一些元注解,如:@Target,@Retention

  • @Target 用來定義你的注解應(yīng)用在什么地方(例如是一個(gè)方法還是類)
  • @Rectetion 用來定義注解在哪一級(jí)別可用射窒,在源代碼中(SOURCE)藏杖,類文件中(CLASS)或者運(yùn)行時(shí)(RUNTIME)
三. 原注解

java 目前只內(nèi)置了三種標(biāo)準(zhǔn)注解将塑,四種原注解

注解 說明
@Target 表示該注解可用于什么地方◎螋铮可能的ElementType的參數(shù)包括:CONSTRUCTOR:構(gòu)造器的說明
FIELD:域說明(包括enum實(shí)例)
LOCAL_VARIABLE 局部變量聲明
METHOD:方法聲明
PACKAGET:包的說明
PARAMETER:參數(shù)的說明
TYPE:類或接口
@Retention 表示需要在什么級(jí)別保存該信息 点寥。可選的RetentionPolicy:
SOURCE:注解將被編譯器丟棄
CLASS:注解將在CLASS文件中可用来吩,但在VM中將被丟棄
RUNTIME:VM將在運(yùn)行期也保留注解敢辩,因此可用通過反射機(jī)制讀取注解的信息
@Docemented 將此注解包含在javadoc中
@Inherited 表示子類允許繼承父類的注解
四. 編寫注解處理器

如果沒有用來讀取注解的工具,那么注解也不會(huì)比注釋更有用弟疆。在javaSE5擴(kuò)展了反射機(jī)制的API戚长,以幫助程序員實(shí)現(xiàn)這類工具

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//@Retention 用來定義該注解在哪一級(jí)可以用
//@Target元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserCase {
    public int id();
    public String description() default "no description";
}


public class PasswordUtils {
    @UserCase(id=10,description="validatePassword")
    public boolean validatePassword(String password){
        return(password.matches("\\w*\\d\\w*"));
    }
    @UserCase(id=18)
    public String encryptPassword(String password){
        return new StringBuilder(password).reverse().toString();
    }
    @UserCase(id=108,description="checkForNewPassword")
    public boolean checkForNewPassword(String password){
        return true;
    }
}


import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class UserCaseTracker {
    public static void trackUserCases(List<Integer> userCase,Class<?> cl){
        for(Method m : cl.getDeclaredMethods()){
            UserCase u = m.getAnnotation(UserCase.class);
            if(u != null){
                System.out.println("Found Use UserCase:"+u.id()+"\t"+u.description());
                userCase.remove(new Integer(u.id()));
            }
        }
        for(int i : userCase){
            System.out.println("Miss user UserCase "+i);
        }
    }
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        Collections.addAll(list, 16,108,10,50);
        trackUserCases(list,PasswordUtils.class);
    }
}
五. 編寫注解處理器

標(biāo)簽@UserCase由UserCase.java定義,其中包含int元素id,String元素description,注解的可用類型如下所示:

  • 所有的基本類型(int,float,boolean等)
  • String
  • Class
  • Annotation
  • 以上類型的數(shù)組

注意:元素不能有不確定的值兽间,要么具有默認(rèn)的值历葛,要么給元素提供元素的值


注解
最后編輯于
?著作權(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
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹲缠。 經(jīng)常有香客問我棺克,道長(zhǎ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
  • 文/蒼蘭香墨 我猛地睜開眼祭埂,長(zhǎng)吁一口氣:“原來是場(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ú)居荒郊野嶺守林人離奇死亡葱轩,尸身上長(zhǎng)有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
  • 我被黑心中介騙來泰國(guó)打工郎楼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窒悔。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓呜袁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親简珠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阶界,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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