註解是JDK1.5有的java
應用註解,進行開發和應用:數組
註解至關於一個特殊的類哦!ide
首先定義一個註解的類 @interface toov5測試
而後應用這個註解 @Aspa
而後對這個類進行反射調用設計
一個註解的生命週期有三個階段:3d
一、 RetentionPolicy.RUNTIMEcode
2 、 RetentionPolicy.SOURCE對象
三、 RetentionPolicy.CLASSblog
分別對應Java源文件 calss文件(經過類加載器調用進內存就沒有了,好比 @Override等) 內存中的字節碼 這三個階段均可以將註解去掉。 設計時候能夠進行聲明
總結: 註解用在哪一個階段、什麼類型(方法、類、包、註解、構造方法等)上面。
元註解以及其枚舉屬性值不用記,直接看java.lang.annotation包下面的類
作一個註解:
@Retention(RetentionPolicy.RUNTIME) //爲註解服務的 元註解 保留到運行期間 //@Target(ElementType.METHOD) //只能放在Method上不能放在類上 @Target( {ElementType.TYPE, ElementType.METHOD}) //數組裏面 類 方法 public @interface toov5 { }
使用它:
@toov5 public class test1 { public static void main(String[] args) { //玩字節碼,看看有註解沒 註解是否在場 boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class); if (annotationPresent){ //若是有這個註解 toov5 annotation = test1.class.getAnnotation(toov5.class); //獲得這個對象 System.out.println(annotation); } } }
註解的屬性至關於一個胸牌,好比實驗中學學生。若是再想細緻的區分,那麼能夠經過這個胸牌再加一個屬性區分。
@MyAnnotation(color = "red")
能夠有默認值:
@Retention(RetentionPolicy.RUNTIME) //爲註解服務的 元註解 保留到運行期間 //@Target(ElementType.METHOD) //只能放在Method上不能放在類上 @Target( {ElementType.TYPE, ElementType.METHOD}) //數組裏面 類 方法 public @interface toov5 { String color() default "red"; //抽象的而且是public的 指定一個屬性默認值 String value(); }
測試:
@toov5(value = "test") // 建立這個註解的實例對象時候須要給屬性賦值 public class test1 { public static void main(String[] args) { //玩字節碼,看看有註解沒 註解是否在場 boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class); if (annotationPresent){ //若是有這個註解 toov5 annotation = test1.class.getAnnotation(toov5.class); //獲得這個對象 System.out.println(annotation.color()+"-----"+annotation.value()); //打印這個註解屬性 取值時候仍是以方法調用的形式進行調用 } } }
屬性複雜一些的好比 數組類型的:
註解:
@Retention(RetentionPolicy.RUNTIME) //爲註解服務的 元註解 保留到運行期間 //@Target(ElementType.METHOD) //只能放在Method上不能放在類上 @Target( {ElementType.TYPE, ElementType.METHOD}) //數組裏面 類 方法 public @interface toov5 { String color() default "red"; //抽象的而且是public的 指定一個屬性默認值 String value(); int[] arrayAttr() default {1,6}; }
使用:
@toov5(value = "test", arrayAttr = {1,3,6}) // 建立這個註解的實例對象時候須要給屬性賦值 public class test1 { public static void main(String[] args) { //玩字節碼,看看有註解沒 註解是否在場 boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class); if (annotationPresent){ //若是有這個註解 toov5 annotation = test1.class.getAnnotation(toov5.class); //獲得這個對象 System.out.println(annotation.color()+"-----"+annotation.value()); //打印這個註解屬性 取值時候仍是以方法調用的形式進行調用 System.out.println(annotation.arrayAttr().length); } } }
結果:
屬性的值可使註解的!
另外寫一個註解:
public @interface toov5Annotation { String value(); }
註解中引用這個註解:
@Retention(RetentionPolicy.RUNTIME) //爲註解服務的 元註解 保留到運行期間 //@Target(ElementType.METHOD) //只能放在Method上不能放在類上 @Target( {ElementType.TYPE, ElementType.METHOD}) //數組裏面 類 方法 public @interface toov5 { String color() default "red"; //抽象的而且是public的 指定一個屬性默認值 String value(); int[] arrayAttr() default {1,6}; //返回註解 toov5Annotation toov5Annotation() default @toov5Annotation("toov5"); //默認值 }
測試:
@toov5(value = "test", arrayAttr = {1,3,6} , toov5Annotation = @toov5Annotation("ttttttest")) // 建立這個註解的實例對象時候須要給屬性賦值 public class test1 { public static void main(String[] args) { //玩字節碼,看看有註解沒 註解是否在場 boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class); if (annotationPresent){ //若是有這個註解 toov5 annotation = test1.class.getAnnotation(toov5.class); //獲得這個對象 System.out.println(annotation.color()+"-----"+annotation.value()); //打印這個註解屬性 取值時候仍是以方法調用的形式進行調用 System.out.println(annotation.arrayAttr().length); System.out.println(annotation.toov5Annotation().value()); } } }
結果:
屬性也但是是枚舉類的!
略
也能夠是class! 略