java中的註解(Annotation)

簡介

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

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

註解與註釋

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

經常使用註解

  • @Override: 修飾重載父類方法;
  • @Deprecated: 修飾將來將被拋棄的類/方法/屬性等等;
  • @SuppressWarnings: 關閉不當編譯器警告信息。

註解運行機制分類

  • 源碼註解: 註解只在源碼中存在,編譯成.class文件中不存在;
  • 編譯時註解: 註解存在於源碼與.class中,運行時不存在;
  • 運行時註解: 在全部階段都存在,能夠影響程序運行邏輯。

註解來源分類

  • 來自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";
    }
}

解析註解

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

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!");
        }
    }
}
  • 使用類加載器加載類,獲取類對象;
  • 判斷是否存在類註解;
  • 取出類註解,作邏輯處理;
  • 方法註解相似。

他山之石

相關文章
相關標籤/搜索