JAVA註解

1.註解的定義

官方定義java

Java 註解用於爲 Java 代碼提供元數據。做爲元數據,註解不直接影響你的代碼執行,但也有一些類型的註解實際上能夠用於這一目的。Java 註解是從 Java5 開始添加到 Java 的。數組

1.1元註解

元註解定義bash

元註解的做用就是負責註解其餘註解。Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型做說明。Java5.0定義的元註解ide

  1. @Target,
  2. @Retention
  3. @Documented
  4. @Inherited

對於註解的跟人理解。舉個不恰當的比喻,註解就比如現實的標籤。好比高富帥標籤,那麼元註解就是具體來註解規範這個高富帥標籤的內容。好比經過元註解規定這個高富帥標籤只能給人使用,動物則不行。好比這個標籤只對成年人有效,小孩子會自動忽略等。post

1.2元註解具體說明

1.2.1 @Retention

Retention 的英文意爲保留期的意思。當 @Retention 應用到一個註解上的時候,它解釋說明了這 個註解的的存活時間。 它的取值以下:性能

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

這3個生命週期分別對應於:Java源文件(.java文件) ---> .class文件 ---> 內存中的字節碼ui

因爲不一樣註解使用的時間是不一樣的,好比動態註解是在運行時獲取註解進行相應操做的,靜態註解則在編譯的時候。因此要精細劃分註解的保留時間就須要這個元註解。使用以下:spa

@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
複製代碼
1.2.2 @Documented

這個元註解確定是和文檔有關。它的做用是可以將註解中的元素包含到 Javadoc 中去code

1.2.3 @Target

@Target 指定了註解運用的地方。就看該標籤是運用到類仍是說方法仍是說其餘某些地方。 具體@Target取值有繼承

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

Inherited 是繼承的意思,可是它並非說註解自己能夠繼承,而是說若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}


@Test
public class A {}


public class B extends A {}

複製代碼

註解 Test 被 @Inherited 修飾,以後類 A 被 Test 註解,類 B 繼承 A,類 B 也擁有 Test 這個註解。

2.預置註解

Java 默認帶了一些註解,平時開發的時候其實也已經在默默使用了。

2.1 @Deprecated

該註解用來標記過期的元素,若某個類或者方法或者元素等被標記了,那麼別的引用到那處代碼的地方會出現劃線,進行標示,提醒使用者,這個代碼已通過時,使用要慎重。

@Deprecated
    public void stopPullLoading() {
    
    }
複製代碼

2.2 @Override

 java.lang.Override 是一個marker annotation類型,它被用做標註方法。它說明了被標註的方法重載了父類的方法,起到了斷言的做用。若是咱們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
複製代碼

2.3 @SuppressWarnings

此註解能告訴Java編譯器關閉對類、方法及成員變量的警告。 SuppressWarning不是一個marker annotation。它有一個類型爲String[]的成員,這個成員的值爲被禁止的警告名。對於javac編譯器來說,被-Xlint選項有效的警告名也一樣對@SuppressWarings有效,同時編譯器忽略掉沒法識別的警告名。

@SuppressWarnings(value={"unchecked","fallthrough"})  
  
public void lintTrap() { /* sloppy method body omitted */ }  
複製代碼

3.自定義註解

使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節。在定義註解時,不能繼承其餘的註解或接口。@interface用來聲明一個註解,其中的每個方法其實是聲明瞭一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。能夠經過default來聲明參數的默認值。

註解參數的可支持數據類型:

  1. 全部基本數據類型(int,float,boolean,byte,double,char,long,short)
  2. String類型
  3. Class類型
  4. enum類型
  5. Annotation類型 6.以上全部類型的數組

  Annotation類型裏面的參數該怎麼設定:   第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲defaul默認類型;      第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這裏的參數成員就爲String;     第三,若是隻有一個參數成員,最好把參數名稱設爲"value",後加小括號.例:下面的例子FruitName註解就只有一個參數成員。

簡單的自定義註解和使用註解實例:

package annotation;  
  
import java.lang.annotation.Documented;  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
/** 
 * 水果名稱註解 
 * @author wangsheng 
 * 
 */  
@Target(ElementType.FIELD)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface FruitName {  
    String value() default "";  
} 
複製代碼

4.註解的做用

我的開發時註解的做用:

  1. 經過註解標註讓系統在編譯或者運行時來處理某些重複事件,如View的id綁定,點擊事件綁定等
  2. 信息收集,好比被註解的類被收集註冊到一個集合,以便於監聽處理
  3. 其餘一些未使用過的功能(接下來想到補充)

5.運行時註解

通常在運行時反射獲取到註解的內容,而後進行相應的操做,好比綁定id等。 參考瞭解:juejin.im/post/5c21fe…

6.編譯時註解

須要使用到APT,在代碼編譯階段根據註解完成相應代碼的添加,因爲在編譯階段完成了相關工做,因此影響比動態註解小,性能更好。

(留坑接下來寫文章填)

相關文章
相關標籤/搜索