註解,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!"); } } }
使用類加載器加載類,獲取類對象;
判斷是否存在類註解;
取出類註解,作邏輯處理;
方法註解相似。
深刻理解Java:註解(Annotation)--註解處理器: http://blog.csdn.net/z69183787/article/details/40378309
全面解析Java註解(視頻):http://www.imooc.com/learn/456