Java萬用字元+註解
一、泛型的萬用字元
1.萬用字元使用的場景
方法的引數
2.萬用字元的優點
使方法更加通用
3.萬用字元分類
無界通配:? 子類限定:? extends Object 父類限定:? super Integer
4.萬用字元的缺點
使變數使用上不再方便 無界:引數和返回值為泛型的方法不能使用! 子類:引數為泛型的方法不能使用 父類:返回值為泛型的方法不能使用
二、註解
1.什麼是註解
語法:@註解名稱 註解的作用:替代xml配置檔案 servlet3.0中,就可以不再使用web.xml檔案,而是所有配置都是用註解 註解是由框架來讀取使用的
2.註解的使用
定義註解類:框架的工作 使用註解:程式設計師的工作 讀取註解(反射):框架的工作
3.定義註解類
@interface A //所有的註解都是Annotation的子類
4.使用註解
註解的作用目標: 類、方法、構造器、引數、區域性變數、包
5.註解的屬性
5.1定義屬性
@interface MyAnno1{
int age();
String name();
}
5.2使用註解時給屬性賦值
@MyAnno1(age=100,name="張三")
5.3註解屬性的預設值:在定義註解時可以給註解指定預設值
@interface MyAnno2{ int age() default 100; String name; } //在使用註解時,可以不給帶有預設值的屬性賦值 @MyAnno2(name="李四")
5.4名為value的屬性的特權
當使用註解時,如果只給名為value的屬性賦值時,可以省略"value=",如:
@MyAnno1(value="hello")
//可以書寫成
@MyAnno1("hello")
5.5註解屬性的型別
八種基本型別、String、Enum、Class、註解型別、以上型別的一維陣列型別
注意:當給陣列型別的屬性賦值時,若陣列元素的個數為1時,可以省略大括號
6.註解的作用目標限定以及儲存策略限定
作用限定目標
讓一個註解的作用目標只能在類上,不能在方法上,這就叫做用目標的限定!
@Target(value = { ElementType.METHOD,ElementType.TYPE}) @interface MyAnno1{ }
保留策略
原始碼檔案(Source):註解只在原始碼中存在,當編譯時就被忽略了 位元組碼檔案(Class):註解在原始碼中存在,然後編譯時會把註解資訊放到了class檔案,但在JVM載入類時,會忽略註解 JVM中(RUNTIME):註解在原始碼、位元組碼檔案中存在,並且在JVM載入類時,會把註解載入到JVM記憶體中(它是唯一可反射註解)
//限定註解的保留策略
@Retention(Retention.RUNTIME)
@interface MyAnno1{
}
7.讀取註解(反射)
Class clazz=this.getClass(); //得到子類的型別
Type type=clazz.getGenericSuperclass(); //獲取傳遞給父類引數化型別
ParameterizedType pType=(ParameterizedType) type; //它就是A<String>
Type [] types=pType.getActualTypeArguments();//它就是一個Class陣列
Class c=(Class) type[0]; //它就是Stirng
System.out.println(c.getName());
7.1要求
註解的保留策略必須是RUNTIME
7.2反射註解需要從作用目標上返回
類上的註解,需要使用Class來獲取 方法上的註解,需要Mehtod來獲取 構造器上的註解,需要Construcator來獲取 成員上的,需要使用Field來獲取
Class: Method、Construtor、Field:AccessibleObject
它們都有一個方法: Annotation getAnnotation(),返回目標上指定型別的註解 Annotation[] getAnnotations(),返回目標上所有註解