Java 註解簡單學習

1,註解概念

Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。
註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

其中涉及到另外一個概念“元註解”,元註解是指註解的註解。包括 @Retention @Target @Document @Inherited @Repeatable 五種。

@Retention

當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。

  • RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
  • RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。
  • RetentionPolicy.RUNTIME 註解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它們。

@Documented

它的作用是能夠將註解中的元素包含到 Javadoc 中去。

@Target

@Target 指定了註解運用的地方。

ElementType.ANNOTATION_TYPE 可以給一個註解進行註解
ElementType.CONSTRUCTOR 可以給構造方法進行註解
ElementType.FIELD 可以給屬性進行註解
ElementType.LOCAL_VARIABLE 可以給局部變量進行註解
ElementType.METHOD 可以給方法進行註解
ElementType.PACKAGE 可以給一個包進行註解
ElementType.PARAMETER 可以給一個方法內的參數進行註解
ElementType.TYPE 可以給一個類型進行註解,比如類、接口、枚舉

@Inherited

如果一個超類被 @Inherited 註解過的註解進行註解的話,那麼如果它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。

@Repeatable

@Repeatable 是 Java 1.8 才加進來的,所以算是一個新的特性,其實只是語法糖而已。

2,自定義註解

註解通過 @interface 關鍵字進行定義。

public @interface PersonAnnotation {

}

註解的屬性

註解的屬性也叫做成員變量。註解只有成員變量,沒有方法。註解的成員變量在註解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotation {

    int age();
    String name();
}

上面代碼定義了 PersonAnnotation 這個註解中擁有 age 和 name 兩個屬性。在使用的時候,我們應該給它們進行賦值。賦值的方式是在註解的括號內以 value=”” 形式,多個屬性之前用 ,隔開。

@PersonAnnotation(age=3,name="Xiaoming")
public class People {

}

參數成員只能用基本類 byte,short,char,int,long,float,double,boolean 八種基本數據類型和 String、Enum、Class、annotations 等數據類型,以及這一些類型的數組.

註解中屬性可以有默認值,默認值需要用 default 關鍵值指定。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotation {

    int age() default 20;
    String name() default "Xiaoming";
}

則可以直接使用,不需要進行復制。

@PersonAnnotation
public class People {

}

註解獲取

要獲取類方法和字段的註解信息,必須通過 Java 的反射技術來獲取 Annotation 對象,因爲你除此之外沒有別的獲取註解對象的方法

isAnnotationPresent()

通過 Class 對象的 isAnnotationPresent() 方法判斷它是否應用了某個註解。

getAnnotation()

通過 getAnnotation() 方法來獲取 Annotation 對象。

屬性值獲取

通過以上兩個註解方法就可以獲取註解的值了,接下來我們通過一個自定義的實例來了解註解以上知識點。

import java.lang.annotation.*;

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotaion {
    int age() default 20;

    String name() default "Xiaoming";
}

首先定義一個 PersonAnnotaion 註解,接着寫一個 Person 類進行使用該註解。

@PersonAnnotaion(age = 22, name = "LiLei")
public class Person {
}

最後寫個測試類用於獲取該註解的屬性值。

public class PersonAnnataionTest {

    public static void main(String[] args) {

        boolean hasAnnotation = Person.class.isAnnotationPresent(PersonAnnotaion.class);

        if (hasAnnotation) {
            PersonAnnotaion testAnnotation = Person.class.getAnnotation(PersonAnnotaion.class);

            System.out.println("age :" + testAnnotation.age());
            System.out.println("name :" + testAnnotation.name());
        }
    }
}

打印結果如下:

以上是類的註解,同樣的,屬性、方法都可以使用註解,最常見的就是 Java 提供了一些內置的註解。

  • @Deprecated 這個元素是用來標記過時的元素,編譯器在編譯階段遇到這個註解時會發出提醒警告,告訴開發者正在調用一個過時的元素比如過時的方法、過時的類、過時的成員變量。
  • @Override 提示子類要複寫父類中被 @Override 修飾的方法
  • @SuppressWarnings 阻止警告的意思。之前說過調用被 @Deprecated 註解的方法後,編譯器會警告提醒,而有時候開發者會忽略這種警告,他們可以在調用的地方通過 @SuppressWarnings 達到目的。

自定義註解類規則

  1. Annotation型定義爲@interface, 所有的Annotation會自動繼承java.lang.Annotation這一接口,並且不能再去繼承別的類或是接口.
  2. 參數成員只能用public或默認(default)這兩個訪問權修飾
  3. 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String、Enum、Class、annotations等數據類型,以及這一些類型的數組.
  4. 要獲取類方法和字段的註解信息,必須通過Java的反射技術來獲取 Annotation對象,因爲你除此之外沒有別的獲取註解對象的方法
  5. 註解也可以沒有定義成員, 不過這樣註解就沒啥用了

以上便是註解的一些基礎知識點。

參考鏈接

1、http://blog.csdn.net/briblue/article/details/73824058
2、https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章