Java基礎加強-反射、註解,java基礎反射註解
基礎加強一、回顧泛型
-
泛型的基本概念:
-
以
ArrayList<E>為例:
-
①
ArrayList<E>中的E稱為型別參數變數
-
ArrayList<Integer>中的Integer稱為實際型別參數
-
②整個
ArrayList<E>稱為泛型型別
-
整個
ArrayList<Integer>稱為參數化類別型(ParameterizedType)
-
定義一個泛型方法:
:
// <T>:泛型定義的聲明,在傳回值前面。public <T> T findOne(Class<T> clazz) {} // 對於靜態泛型方法,都必須自己定義後才能使用public static <T> void findTwo(){}// 定義多個泛型public static <K,V> V find(K k);
-
定義一個帶泛型的類:
// 類層級的泛型定義,類中的"執行個體方法"就可以直接使用了。public class Demo<T> {}
二、泛型的反射
// 擷取帶有泛型資訊的父類,例如:BaseDao<User>,這個整體稱為:ParameterizedType,Type是Class類的介面Type type = XXX.class.getGenericsSuperclass(); ParameterizedType ptype = type;Clazz clazz = ptype.getActualTypeArguments()[0];
三、註解
-
介紹
-
①從JDK5.0開始,Java增加對中繼資料(MetaData)的支援,也就是註解(Annotation)。
-
②Annotation其實就是代碼裡的特殊標記,它用於代替設定檔。傳統的方式中,使用配置告訴類如何運行,有了註解以後,開發人員可以通過註解告訴類如何運行。
-
③在Java技術裡註解的
典型應用是:可以通過反射技術得到類裡面的註解,以決定怎麼樣運行類。
-
基本的註解
-
① SupperssWarnings:抑止警告
-
自訂註解
-
① 註解的定義
public @interface MyAnnotation {}
-
② 註解的屬性:既不像方法,也不像欄位。
註解屬效能夠使用的類型:primitive(基本類型),String,Class,Annotation,enum或者是以上類型的一維數組。
如果給註解中的屬性賦值,可以只指定一個值,也可以指定多個值。
public @interface MyAnnotation_1 { // 註解的屬性 String name(); // 帶預設值的屬性 int age() default 18; }
-
③ 使用註解及屬性:
public class UseAnnotation { @MyAnnotation_1(name = "ABC", age = 18) public void test1(){}}
-
註解的反射
-
涉及到的API:java.lang.reflect.AnnotatedElement
-
Class,Constructor,Field,Method,Packages都實現了該介面。
// 擷取自己所擁有的指定的註解類型,aType是一個註解類型的位元組碼對象。Annotation getAnnotataion(Class<T> aType); // 返回所有的註解Annotation[] getAnnotations(); // 判斷自己有沒有指定的註解類型boolean isAnnotationPresent(Class<? extends Annotation> aType);
-
類的三種狀態
-
① SOURCE: .java檔案
② CLASS: .class檔案
③ RUNTIME:記憶體中的class,由類載入器把.class檔案載入入記憶體。
-
註解使用的生命週期
-
① 註解的
預設存放的
範圍是:位元組碼狀態。運行時(RUNTIME)是沒有的。
-
使用元註解改變註解的存活範圍
-
① 只能用於註解的註解,就是元註解。
@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation_1 {}
-
使用元註解改變註解的置放位置
-
① 放在類上:@Target(ElementType.TYPE)
-
② 放在方法上:@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyAnnotation_1 {}