java中的註解(Annotation)

簡介

註解,java中提供了一種原程序中的元素關聯任何信息、任何元素的途徑的途徑和方法。java

註解是那些插入到源代碼中使用其餘工具能夠對其進行處理的標籤。註解不會改變程序的編譯方式。java編譯器會對包含註解與不包含註解的代碼生成相同的虛擬機指令。在java中,註解是被當作修飾符(如public/static之類)來使用的。程序員

註解與註釋

註釋是供人看的,註解是供程序調用的。一種是程序員寫給另外一個程序員的,一種是程序員寫給計算機解析的。ide

經常使用註解

  • @Override : 修飾重載父類方法;工具

  • @Deprecated : 修飾將來將被拋棄的類/方法/屬性等等;.net

  • @SuppressWarnings: 關閉不當編譯器警告信息。code

註解運行機制分類

  • 源碼註解: 註解只在源碼中存在,編譯成.class文件中不存在;視頻

  • 編譯時註解: 註解存在於源碼與.class中,運行時不存在;對象

  • 運行時註解: 在全部階段都存在,能夠影響程序運行邏輯。blog

註解來源分類

  • 來自jdk的註解:如@Override /@Deprecated等等;繼承

  • 三方的註解: 如junit中的@Test/@Before等等;

  • 自定義註解: 經過元註解自定義的註解。

元註解

給註解進行註解,用於自定義註解。

  • @Target: 指明定義的註解的做用域,其值包括:

    • ElementType.CONSTRUCTOR: 構造方法聲明;

    • ElementType.FIELD: 屬性/字段聲明;

    • ElementType.LOCAL_VARIABLE: 局部變量聲明;

    • ElementType.METHOD: 方法聲明;

    • ElementType.PACKAGE: 包聲明;

    • ElementType.PARAMETER: 參數聲明;

    • ElementType.TYPE: 類接口聲明;

    • ElementType.ANNOTATION_TYPE: 註解類型聲明;

    • ElementType.TYPE_PARAMETER: 類型參數聲明(@since 1.8);

    • ElementType.TYPE_USE: 類型使用(@since 1.8)

  • @Retention: 自定義註解的生命週期,其值包括:

    • RetentionPolicy.SOURCE: 只在源碼顯示,編譯時丟棄;

    • RetentionPolicy.CLASS: 編譯時記錄到.class中,運行時忽略;

    • RetentionPolicy.RUNTIME: 運行時存在,可經過反射來讀取。

  • @Inherited: 一個標記註解,闡述了某個被標註的類型是被繼承的,只能繼承與類。

  • @Documented: 用於描述其它類型的annotation應該被做爲被標註的程序成員的公共API,所以能夠被例如javadoc此類的工具文檔化。Documented是一個標記註解,沒有成員。

自定義註解

//@Target(ElementType.METHOD)
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    String desc() default "";
    String author() default "";
    int age() default 18;
}
  • 使用關鍵字@interface定義註解;

  • 成員變量以無參無異常的方式聲明;

  • 能夠經過default關鍵字給成員變量指定默認值;

  • 成員變量的類型是受限制的,包括原始類型、String、Class、Annotation、Enumeration;

  • 若是註解只有一個成員變量,則成員名稱必須取名value(),在使用中能夠忽略成員名稱與賦值號(=);

  • 註解能夠沒有成員,沒有成員的註解稱爲標示註解。

使用註解

// @<註解名稱>(<成員名1>=<成員值1>,<成員名2>=<成員值2> ...)

@Description(desc = "I'm class annotation")
public class AnnotationApp {

    @Description(desc = "I'm method annotation",author = "rudy")
    public String eyeColor(){
        return "red";
    }
}

解析註解

經過反射獲取類、方法、成員上的運行時註解信息,從而實現動態控制程序運行的邏輯。

import Annotation.Description;
import org.junit.Test;

public class AnnotationTest {

    @Test
    public void testParse() throws ClassNotFoundException {
        // 取出註解
        Class cls = Class.forName("Annotation.AnnotationApp");
        boolean isExit =  cls.isAnnotationPresent(Description.class);
        if(isExit){
            // 作邏輯處理
            Description annotation = (Description) cls.getAnnotation(Description.class);
            System.out.println("get annotation:" + annotation.desc());
        }else{
            System.out.println("no annotation!");
        }
    }
}
  • 使用類加載器加載類,獲取類對象;

  • 判斷是否存在類註解;

  • 取出類註解,作邏輯處理;

  • 方法註解相似。

他山之石

相關文章
相關標籤/搜索