JAVA註解開發介紹

JAVA註解介紹

前言

在我們的日常學習和編寫項目的時候可能會遇到一些寫在類、方法上或者是變量上的註解,比如:

@Componet
public class Hello{
	@Override
	public String toString(){
		return "";
	}
}

這些註解有的可以幫助我們解決很多的問題,比如:@Override幫我們解決方法是否是重寫的,Spring中的@Compoent幫我們把類注入IOC容器,AOP提供的註解簡單就完成了切面的增強…
爲什麼一個簡單註解可以解決這麼多的問題?這次我就對註解進行一個簡單的入門幫大家簡單瞭解一下註解魅力!!

一個大佬寫的有關注解的博客:傳送門


正文

  • 註解(Annotations)的定義摘自百度百科

註解基礎知識點
定義:註解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋。

注意:百度百科其實說的比較明白了註解其實是對元素進行說明的,其實就和註釋一樣。它本身並不具備各種邏輯功能,比如@Override的源代碼:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
  • 註解(Annotations)的結構

在這裏插入圖片描述
這整個頭就是註解了:
注意:

  1. 註解就和一個類一樣,既可以沒有屬性也可以沒有功能,但一般這種情況幾乎沒有。
  2. 註解的功能不一定被定義域註解域中(可以理解爲類的方法不在本類中),這個要是情況而定
  3. 註解內部的屬性的類型只支持基本數據類型、String、枚舉,支持在內部創建枚舉。
  • 註解(Annotations)的四大元註解

    @Documented
    @Inherited
    @Target(ElementType.METHOD,)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {}
    
    上述的@Documented@Inherited@Target@Retention四個註解就是元註解,我們所有自定義的註解一般都繞不開它們。
    • @Target:
      此註解的取值將影響註解的使用地點,是類註解還是方法註解等。當去只取一個的時候直接填寫值即可,多個的時候以value={}的數組形式填寫。

      可取的值
      ElementType.TYPE:用於描述類、接口或enum聲明
      ElementType.FIELD:用於描述實例變量
      ElementType.METHOD
      ElementType.PARAMETER
      ElementType.CONSTRUCTOR
      ElementType.LOCAL_VARIABLE
      ElementType.ANNOTATION_TYPE 另一個註釋
      ElementType.PACKAGE 用於記錄java文件的package信息

    • @Retention:
      此註解的取值將影響註解的生命週期,換句話說就是註解在什麼時候被銷燬,這將影響到註解的功能。

    可取的值,只能選擇其一
    RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。
    RetentionPolicy.CLASS : 在類加載的時候丟棄。在字節碼文件的處理中有用。註解默認使用這種方式。
    RetentionPolicy.RUNTIME : 始終不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的信息。我們自定義的註解通常使用這種方式。

    • @Documented:
      此註解表示是否將該註解的信息加入java文檔
    • @Inherited:
      定義該註釋和子類的關係

實踐

這個例子只是註解的簡單入門使用,會加上註解的功能,會涉及到反射的用法,但是代碼結構簡單。代碼的大致結構也是按照上一篇博客給出的鏈接所編寫

// 註解定義
@Target(value = {ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    public enum FLAG{TRUE, FLASE}
    public enum STATUS{BEFORE, ING, AFTER}
    public String Author() default "lxx";
    public FLAG Flag() default FLAG.FLASE;
    public STATUS Status();
}
// 註解功能類 定義了註解功能
public class LoadMyAnnotation {
    public static void LoadMyAnnotationA(){
        // 獲取含有註解的類的Class
        Class myannotation = ImpClass.class;
        for (Method method : myannotation.getMethods()){
            // 這個方法使用了泛型處理
            MyAnnotation temp = method.getAnnotation(MyAnnotation.class);
            if(temp != null){
                System.out.println("Method Name" + method.getName());
                System.out.println("Autor:" + temp.Author());
                System.out.println("Flag:" + temp.Flag());
                System.out.println("Status:" + temp.Status());
            }
        }
    }
}

// 註解使用類
public class ImpClass {
    @MyAnnotation(Author = "假人", Flag =  MyAnnotation.FLAG.TRUE, Status = MyAnnotation.STATUS.BEFORE)
    public void Helloword(){
        System.out.println("helloword");
    }
}

// Main方法測試類
public class Client{
	public static void main(String[] args) throws Exception {
		// 加載註解 會輸出ImpClass註解中定義的屬性和"helloword"
	    LoadMyAnnotation.LoadMyAnnotationA();
        // 調用 沒有任何的變化
        ImpClass impClass = new ImpClass();
        impClass.Helloword();
	}
}

總結

這篇博客所介紹關於註解的部分僅僅是個入門,在JAVA龐大的開源和商業框架中,註解的種類和功能千遍萬化,本文章僅僅是入門前的臺階,希望大家能拋去浮躁認真學習。

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