Java基礎(chǔ)之注解Annotation

Java之注解.png

Java 注解用于為 Java 代碼提供元數(shù)據(jù)茶袒。作為元數(shù)據(jù)划鸽,注解并不會直接影響你的代碼執(zhí)行冗恨。

1. 注解的定義

注解的定義與類的定義有些類似,只是將class換成@interfacexiu即可

public @interface AnnoTest {
    
}

但僅僅被@interface修飾還不夠檩淋,一個完整的自定義注解還需要配合元注解使用芬为。所以還先需要了解元注解是什么萄金?怎么使用蟀悦?

2. 注解分類

  • JDK自帶注解:@Override、@Deprecated氧敢、@SuppressWarning
  • 元注解:@Target日戈、@Retention、@Inherited孙乖、@Documented
  • 自定義注解
2.1 JDK自帶注解
  • @Override:表示為被重寫的方法
  • @Deprecated:表示過時的方法
  • @SuppressWarning:表示忽略警告
2.2 元注解

用來標記注解的注解

  • @Target

表示注解的作用域浙炼,通過枚舉類ElementType表達作用類型份氧,可以是類,方法弯屈,方法參數(shù)變量等蜗帜。

其中枚舉類ElementType的取值如下:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE, // 作用于接口、類资厉、枚舉厅缺、注解

    /** Field declaration (includes enum constants) */
    FIELD, // 作用于字段、枚舉的常量

    /** Method declaration */
    METHOD, // 作用于方法

    /** Formal parameter declaration */
    PARAMETER, // 作用于方法參數(shù)

    /** Constructor declaration */
    CONSTRUCTOR, // 作用于構(gòu)造方法

    /** Local variable declaration */
    LOCAL_VARIABLE, // 作用于局部變量

    /** Annotation type declaration */
    ANNOTATION_TYPE, // 作用于注解(@Retention注解中就使用該屬性)

    /** Package declaration */
    PACKAGE, // 作用于包

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER, // 作用于類型泛型宴偿,即泛型方法湘捎、泛型類、泛型接口 (jdk1.8加入)

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}
  • @Retention

表示注解存在的生命周期窄刘。注解存在階段是保留在源碼(編譯期)窥妇,字節(jié)碼(類加載)或者運行期(JVM中運行)。通過枚舉類RetentionPolicy來表示注解保留時期娩践。

其中枚舉類RetentionPolicy的取值如下:

public enum RetentionPolicy {
    /**
     * 注解只存在源碼中,編譯時會丟棄
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * 默認的保留策略活翩,注解會在class字節(jié)碼文件中存在,但運行時無法獲得
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * 注解會在class字節(jié)碼文件中存在翻伺,在運行時可以通過反射獲取到
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}
  • @Documented

它的作用是能夠?qū)⒆⒔庵械脑匕?Javadoc 中去纱新。

  • @Inherited

一個被@Inherited注解了的注解修飾了一個父類,如果他的子類沒有被其他注解修飾穆趴,則它的子類也繼承了父類的注解脸爱。

2.3 自定義注解(后面講解)

3. 注解的作用

  • 標記,用于告訴編譯器的一些信息
  • 編譯時動態(tài)處理未妹,如動態(tài)生成代碼
  • 運行時動態(tài)處理簿废,如得到注解信息

4. 自定義注解并解析注解

4.1 自定義注解
  • 使用@interface關(guān)鍵字定義注解
  • 成員以無參無異常的方式聲明
  • 可以用default為成員指定默認值
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AnnoTest {  // 使用@interface關(guān)鍵字定義注解
    //成員以無參無異常的方式聲明
    String desc();
    String author();
    
    //可以用default為成員指定默認值
    int age() default 18;
}
4.2 注解的屬性類型
  • 基本數(shù)據(jù)類型
  • String類型
  • 枚舉類型
  • 注解類型
  • Class類型
  • 以上類型的數(shù)組類型
4.3 使用注解

注解屬性賦值:如果注解有多個屬性,則可以在注解括號中用“,”號隔開分別給對應(yīng)的屬性賦值

@AnnoTest(desc="annotation class desc", author="annotation class author",age=20)
public class AnnoTestDemo {

    @AnnoTest(desc="annotation method desc", author="annotation method author",age=30)
    public String test() {
        return "test";
    }
}
4.4 解析注解

注:如果我們在定義自己的注解的時候,將@Retention(RetentionPolicy.RUNTIME)改為@Retention(RetentionPolicy.SOURCE)或者@Retention(RetentionPolicy.CLASS),運行上面的程序是不會出現(xiàn)任何結(jié)果络它,因為只有運行時注解可以通過反射獲取,其他兩種注解在運行時已經(jīng)被丟棄了族檬。

public static void main(String[] args) {
    try {
        //1、使用類加載器加載類
        Class<?> c = Class.forName("com.anno.AnnoTestDemo");
        //2化戳、找到類上面的注解
        //先判斷AnnTestDemo類上面有沒有AnnoTest這樣的注解
        boolean isExist = c.isAnnotationPresent(AnnoTest.class);
        if (isExist) {
            //3单料、獲取類上的注解實例
            AnnoTest classAnno = (AnnoTest) c.getAnnotation(AnnoTest.class);
            System.out.println(classAnno.author());
        }

        //4、找到方法上的注解
        //拿到給定類所包含的方法
        Method[] methods = c.getDeclaredMethods();
        //遍歷方法
        for (Method method : methods) {
            boolean isMExist = method.isAnnotationPresent(AnnoTest.class);
            if (isMExist) {
                //拿到每個方法上的注解
                AnnoTest methodAnno = method.getAnnotation(AnnoTest.class);
                System.out.println(methodAnno.author());
            }
        }

        //另外一種解析方法上注解的方式
        //遍歷所有的方法
        for (Method method : methods) {
            //拿到每個方法上的注解
            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation instanceof AnnoTest) {
                    AnnoTest methodAnno = (AnnoTest) annotation;
                    System.out.println(methodAnno.author());
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

5. 參考

http://www.reibang.com/p/9471d6bcf4cf

公共技術(shù)點之 Java 注解 Annotation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点楼,一起剝皮案震驚了整個濱河市扫尖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掠廓,老刑警劉巖换怖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟀瞧,居然都是意外死亡沉颂,警方通過查閱死者的電腦和手機条摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铸屉,“玉大人钉蒲,你說我怎么就攤上這事〕固常” “怎么了子巾?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長小压。 經(jīng)常有香客問我线梗,道長,這世上最難降的妖魔是什么怠益? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任仪搔,我火速辦了婚禮,結(jié)果婚禮上蜻牢,老公的妹妹穿的比我還像新娘烤咧。我一直安慰自己,他們只是感情好抢呆,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布煮嫌。 她就那樣靜靜地躺著,像睡著了一般抱虐。 火紅的嫁衣襯著肌膚如雪昌阿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天恳邀,我揣著相機與錄音懦冰,去河邊找鬼。 笑死谣沸,一個胖子當著我的面吹牛刷钢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳附,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼内地,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赋除?” 一聲冷哼從身側(cè)響起阱缓,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贤重,沒想到半個月后茬祷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡并蝗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年祭犯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滚停。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沃粗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出键畴,到底是詐尸還是另有隱情最盅,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布起惕,位于F島的核電站涡贱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惹想。R本人自食惡果不足惜问词,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘀粱。 院中可真熱鬧激挪,春花似錦、人聲如沸锋叨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃磺。三九已至薄湿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偷卧,已是汗流浹背嘿般。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涯冠,地道東北人炉奴。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像蛇更,于是被迫代替她去往敵國和親瞻赶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355