1. 程式人生 > >註解和反射

註解和反射

一、註解

       英文:Annotation

      1.1 註解的概念

              註解也叫元資料,用來標記程式碼,描述資料,是有特殊意義的。

     1.2 註解作用

              1、Javadoc將文件註釋生成api文件時,會將一些註解內容生成到Api文件中,如               @return @see @param

              2、編譯時進行格式檢查,如@Override

              3、使用註解,減少配置檔案,如框架中。

              4、抑制警告

     1.3 四個內建註解

              就是java寫好的註解,直接用。

              @Override:標記重寫方法

              @Deprecated:標記方法已過時,但是也可以用

              @SuppressWarnings():抑制編譯器警告,可以抑制位元組結構體範圍內“{ }” 的警告,如eclipse中的黃線

              @SafeVarargs:抑制堆汙染警告(單獨警告),如可變引數和泛型同時使用情況

      

             

      1.4 四個元註解

              在定義註解時,用於註解註解的註解

              @Target:被標記的註解可以註解的位置

              ElementType是列舉型別,位置有:

                                   TYPE : 型別

                                   FIELD : 欄位

                                   METHOD : 普通方法

                                   PARAMETER : 引數

                                   CONSTRUCTOR : 可以標記構造方法

                                   LOCAL_VARIABLE : 區域性變數

                                   ANNOTATION_TYPE :可以標記在註解上面

                                   PACKAGE :包

                                   TYPE_PARAMETER  形式引數型別

                                   TYPE_USE      :哪裡都可以標記

              @Retention:被標記的註解存在的生命週期

              RetentionPolicy是列舉型別,生命週期有:

                            SOURCE: java原始碼.java檔案中可以存在

                          CLASS :編譯之後的位元組碼檔案中可以存在

                           RUNTIME :執行時編譯成位元組碼了,放入到jvm中了,這個註解還在

              @Documented:被標記的註解生成文件時是否生成在文件中

              @Inherited:被標記的註解在類繼承中是否被繼承

      1.5 自定義註解

              在以後的實際開發中,我們基本上不會自定義註解,都是用別人定義好的。我們自 定義的註解,如果沒有第三方程式(使用反射技術)的支援,是沒有任何意義的。

             

 

二、反射

       英文:Reflect

      2.1 面向物件再次理解

              Java語言設計時,就是想將生活中的物件與物件之間的關係在計算機中體現,萬事萬物皆物件,而物件又可以分類即是類,類是描述物件的一個抽象模板,在程式設計時我們主要目的就是為了操作資料即是操作物件,資料型別即描述物件的就是類。

      2.2 反射的概念

              Java提供的一項技術,在執行時期動態的獲得一個類的屬性,方法,構造方法等,並且也可以修改這些東西(私有的也能獲得)。Class類就是描述類的型別,一個類只有一個類型別。

     2.3 獲取位元組碼物件

              物件.getClass();

              類名.Class;

              Class.forName(“類的全限定名”);

      

      2.4 各種資料型別獲得位元組碼物件

              基本資料型別

              引用資料型別

              介面

              列舉

              陣列

              void

       注意:1、基本資料型別的位元組碼物件也可以通過包裝型別.TYPE獲取

              2、void的位元組碼也可以通過Void. TYPE獲取

      2.5 獲得構造器

       Constructor<T> getConstructor(Class<?>... parameterTypes) :獲得指定公共構造器

       Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) :獲得構造器(可是私有)

       Constructor<?>[] getConstructors() :獲得所有公共構造器

       Constructor<?>[] getDeclaredConstructors() :獲得所有構造器(包括私有)

     2.6使用構造器建立物件

   

 

     2.7使用反射技術寫註解描述注入物件

  思路:通過反射獲取到欄位和註解,通過註解值獲取注入物件,將物件設定在欄位中。