1. 程式人生 > >Java萬用字元+註解

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(),返回目標上所有註解