Java Annotations

Java常見注解

JDK自帶注解

  • @Override:重寫
  • @Deprecated:過時
  • @Suppvisewarnings:忽略警告

常見第三方注解 > Spring

  • @Autowired
  • @Service
  • @Respository

常見第三方注解 > Mybatis

  • @InsertProvider
  • @UpdateProvider
  • @Options

注解分類

按照運行機制分

  • 源碼注解:注解只在源碼中存在,編譯成.class文件就不存在了。
  • 編譯時注解:注解在源碼和.class文件中都存在梯浪。(@Override夯秃,@Deprecated祟剔,@Suppvisewarnings)
  • 運行時注解:在運行階段還起作用搓彻,甚至?xí)绊戇\行邏輯空扎。(@Autowired)

按照來源分

  • 來自JDK的注解
  • 來自第三方的注解
  • 自定義的注解

元注解

自定義注解

自定義注解語法要求

  • 使用@interface關(guān)鍵字定義注解浅缸。
  • 成員以無參無異常方式聲明枉疼,可以用default為成員指定一個默認(rèn)值皮假,成員類型是受限制的,包括基本數(shù)據(jù)類型骂维,String惹资,Class,Annotation航闺,Enumeration褪测。
  • 如果注解只有一個成員猴誊,則成員必須取名為value(),在使用時可以忽略成員名和賦值號(=)侮措。
  • 注解類可以沒有成員懈叹,沒有成員的注解稱為標(biāo)識注解。
  • 元注解 @Target:注解的作用域分扎,包括CONSTRUCTOR(構(gòu)造方法聲明)澄成,F(xiàn)IELD (字段聲明),LOCAL_VARIABLE(局部變量聲明)畏吓,METHOD(方法聲明)墨状,PACKAGE(包聲明)审洞,PARAMETER(參數(shù)聲明)间护,TYPE(類,接口)。
  • 元注解 @Retention:注解的生命周期巴粪,包括SOURCE(只在源碼顯示,編譯時會丟棄)粥谬,CLASS(編譯時會記錄到class中肛根,運行時忽略),RUNTIME(運行時存在漏策,可以通過反射讀扰烧堋)。
  • 元注解 @Inherited:允許子類繼承掺喻。
  • 元注解 @Documented:生成javadoc時會包含注解芭届。
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {

    String desc();
    String author();
    int age() default 18;

}

使用自定義注解

<注解名>(<成員名1> = <成員值1>, <成員名2> = <成員值2>, ...)

    @Description(desc = "hello desc", author = "tom", age = 19)
    public void test() {
        
    }

解析注解

通過反射獲取類,函數(shù)或成員上的運行時注解信息感耙,從而實現(xiàn)動態(tài)控制程序的邏輯褂乍。
子類注解優(yōu)先級高于父類注解。

  • 定義注解
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description2 {

    String value();

}
  • 引用注解
@Description2("I am class Person annotation")
public class Person {

    @Description2("I am class Person : method name annotation")
    public String name() {
        return null;
    }

    @Description2("I am class Person : method age annotation")
    public int age() {
        return 0;
    }

    public void sing() {

    }

}

@Description2("I am class Man annotation")
public class Man extends Person {

    @Override
    @Description2("I am class Man : method name annotation")
    public String name() {
        return super.name();
    }

}
  • 解析注解 & 運行結(jié)果
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {

        // 使用類加載器加載類
        Class<?> c = Class.forName("annotation.Man");

        // 找到類上面的注解
        boolean isPresent = c.isAnnotationPresent(Description2.class);

        // 獲取注解實例
        if (isPresent) {
            Description2 desc2 = c.getAnnotation(Description2.class);
            System.out.println(desc2.value());
        }

        // 找到方法上的注解
        Method[] methods = c.getMethods();

        // 獲取注解實例 1
        for (Method method : methods) {
            boolean isMPresent = method.isAnnotationPresent(Description2.class);
            if (isMPresent) {
                Description2 mDesc2 = method.getAnnotation(Description2.class);
                System.out.println("1:" + mDesc2.value());
            }
        }
        // 獲取注解實例 2
        for (Method method : methods) {
            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation instanceof Description2) {
                    Description2 desc2 = (Description2) annotation;
                    System.out.println("2:" + desc2.value());
                }
            }
        }
    }

}
I am class Man annotation
1:I am class Man : method name annotation
1:I am class Person : method age annotation
2:I am class Man : method name annotation
2:I am class Person : method age annotation
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末即硼,一起剝皮案震驚了整個濱河市逃片,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌只酥,老刑警劉巖褥实,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裂允,居然都是意外死亡损离,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門绝编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僻澎,“玉大人,你說我怎么就攤上這事≡趵猓” “怎么了哩俭?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拳恋。 經(jīng)常有香客問我凡资,道長,這世上最難降的妖魔是什么谬运? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任隙赁,我火速辦了婚禮,結(jié)果婚禮上梆暖,老公的妹妹穿的比我還像新娘伞访。我一直安慰自己,他們只是感情好轰驳,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布厚掷。 她就那樣靜靜地躺著,像睡著了一般级解。 火紅的嫁衣襯著肌膚如雪冒黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天勤哗,我揣著相機與錄音抡爹,去河邊找鬼。 笑死芒划,一個胖子當(dāng)著我的面吹牛冬竟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播民逼,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼泵殴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缴挖?” 一聲冷哼從身側(cè)響起袋狞,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎映屋,沒想到半個月后苟鸯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡棚点,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年早处,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫析。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡砌梆,死狀恐怖默责,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咸包,我是刑警寧澤桃序,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站烂瘫,受9級特大地震影響媒熊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坟比,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一芦鳍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葛账,春花似錦柠衅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巩割,卻和暖如春裙顽,著一層夾襖步出監(jiān)牢的瞬間付燥,已是汗流浹背宣谈。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留键科,地道東北人闻丑。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像勋颖,于是被迫代替她去往敵國和親嗦嗡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理饭玲,服務(wù)發(fā)現(xiàn)侥祭,斷路器,智...
    卡卡羅2017閱讀 134,669評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,183評論 25 707
  • ——透過窗簾的茄厘,是屋子里桔黃的燈光么矮冬?那是暖暖的朦朧的詩意,詩意的恍如皎潔的月光次哈。不知不覺在心中喚起一種似曾相識的...
    數(shù)豆者m閱讀 277評論 1 3
  • 1.數(shù)組key和value的條件限制 1.key可以是integer或者string 2.value可以是任意類型...
    白白的沸羊羊閱讀 334評論 0 0
  • 我的奶奶離開我已經(jīng)足足四十年了胎署!從她老人家去世以后的這近四十年來,在我的靈魂深處窑滞,從來就不曾安頓過琼牧。一直以來恢筝,我為...
    鬼谷孫子閱讀 276評論 0 3