@interface自定義註解學習筆記

1.註解是什麼,與註釋的區別

註解與註釋都是用於解釋與說明,註釋主要是用來自己看及給開發的程序員看,註解更側重於jvm看,也可以看作一種標記。

2.註解的歷史

註解不是一開始就有的,jdk1.5之後sun公司開發了註解接口並公開,使第三方公司能夠開發使用,得到廣泛應用。例如Spring公司、Hibernate、Struts2等公司都支持註解開發!

3.註解的作用

註解的主要作用除了用於解釋說明,jvm標記外,還有個重要作用是替代了配置文件,使開發更加簡潔方便。

4.註解的類型

註解的主要類型大致分三類:

官方註解:即原生註解(也是功能註解)

              @Deprecated:用於標誌過時的類、方法和成員變量

              @Override:用於修飾重寫的方法

              @SuppressWarnings:用戶忽略

              @Deprecated標誌過的警告

自定義註解:

元註解:@Retention  和  @Target  爲最常用的

@Retention , @Target , @Inherited , @Documented , @Repeatable , @Native

其中,@Native、@Repeabable是在jdk1.8之後推出的元註解!

            @Retention: 表示註解保留週期

            @Target: 表示註解可以使用在什麼地方

            @Documented: 註解寫入文檔

            @Inherited : 子類繼承父類的註解(子類沒有任何註解修飾)

            @Repeatable : 表示註解的屬性可以重複!@Repeatable通俗來講,就是註解容器!

 

5.註解的關鍵字

定義類,關鍵字是 class

定義接口,關鍵字是 interface

定義枚舉,關鍵字是 enum

定義註解,關鍵字是@interface

 

定義註解的格式

public @interface SelfDefAnno {

}

5.使用自定義註解的注意事項

1.使用自定義註解時:

① 沒有使用元註解時,可以在任意位置添加註解(類,字段,方法)

② 註解中內容(只有類似類中得成員變量,需要在變量名後加括號),並且只有java中的8中基本數據類型,字符串String類型,Class類型,註解類型,或者以上類型的一維數組

如:

public @interface SelfDefAnno { 
  String name(); String類型 
  int age(); 基本數據類型 
  // Date d(); 不符合類型會報錯 only primitive type, String, Class, annotation, enumeration 
  are permitted or 1-dimensional arrays thereof 
  Class clazz(); class類型 
  Color c();//枚舉 枚舉類型 
  SelfDefAnno2 a(); // 註解類型 
  int[] ages(); 數組類型 
} 


enum Color{ 
  RED,YELLOW 
} 
@interface SelfDefAnno2 { 
  String name(); 
}

③ 如果註解類中沒有內容,可以直接使用,否則需要將所有內容均賦值(可以直接賦值,或使用時賦值)

如:

直接賦值方法:關鍵字 defualt

public @interface SelfDefAnno { 
    String name() defualt "張三";//String類型 
    int age() defualt 20; //基本數據類型 
    Class clazz() defualt String.class; //class類型 
    Color c() defualt Color.YELLOW;//枚舉 枚舉類型 
    SelfDefAnno2 s() defualt @SelfDefAnno2(name="lisi"); // 註解類型; 
    int[] ages() defualt {"元素1","元素2"}}; 數組類型 
}

使用時賦值方法: @SelfDefAnno(name="zs",age=18,clazz=int.class,c=Color.YELLOW,ages= {1,2,3},s=@SelfDefAnno2(name="zs")) class A{ }

④ 如果註解類中只有一個成員變量,並且命名是value,使用時可以省略value=,如果只有一個成員變量,命名是value的數組,其中數據元素唯一時,可以省略數組的大括號

列如:

public @interface SelfDefAnno { 
    String value() defualt "張三"; //String類型 
} 

使用時:註解中可以省略value 
完整版:
@SelfDefAnno(value="lisi") 
public class A(){ 
}
省略版:
@SelfDefAnno("lisi") 
public class A(){ 
}

 

public @interface SelfDefAnno { 
    String[] value() defualt "張三"; //String類型
 } 
使用時:註解中可以省略value和大括號 
多個元素完整版:
@SelfDefAnno(value={"lisi","zs"}) 
public class A(){ 
}
多個元素省略版(與其他類型一樣,可以去掉value=):
@SelfDefAnno({"lisi","zs"}) 
public class A(){ 
}
單個元素完整版:
@SelfDefAnno(value={"lisi"}) 
public class A(){ 
}
單個元素省略版(可以去掉value=和大括號):
@SelfDefAnno("lisi") 
public class A(){ 
}

6.常用的元註解及說明

@Retention 使用註解的時機,默認class

源碼階段(source),編譯階段(class),運行階段(runtime)

 

@Target 限定使用位置

type 類上使用

field 字段上使用

method 方法上使用

 

7.運行機制

反射機制

 

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