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.運行機制
反射機制