天天看點

Android(java)學習筆記46:反射機制

1. 反射機制:

JAVA反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。 要想解剖一個類,必須先要擷取到該類的位元組碼檔案對象。而解剖使用的就是Class類中的方法.是以先要擷取到每一個位元組碼檔案對應的Class類型的對象.

擷取任何相應.class檔案對應的Class類型的對象,然後利用這個對象去調用該.class檔案中任意成員變量和方法。

但是獲得.class檔案的Class類對象是重點,怎麼擷取呢?

(1)Class類:

成員變量:   類Field,通過這個表示成員變量的類的對象,去調成員變量

構造方法:   類Constructor,通過這個表示構造方法的類的對象,去調構造方法

成員方法:   類Method,通過這個表示成員方法的類的對象,去調成員方法

Class類的成員變量、構造方法和成員方法都是類。

(2)擷取.class檔案的Class類對象的三種方式:

方式1:Object類的getClass()方法

          Person p = new  Person();

          Class c = p.getClass();

注意:倘若:

          Person p2 = new  Person();

          Class c2 = p.getClass();

          System.out.println(c == c2);// true  Class類是抽象總結,自然也表示一個類

Class類是其他類的抽象總結,它裡面的成員變量,構造方法,成員方法都是一樣,是對應的抽象的總結,自然也表示一個類。

方式2:資料類型(基本類型和引用類型)的靜态屬性class

          Class  c3= Person.class;

           System.out.println(c == c3);// true   雖然擷取Class對象的方式不一樣,但是Class類是抽象總結,自然也表示一個類

         類似有Class c1 = int.class;

                  Class c2 = String.class;

方式3:Class類中的靜态方法

      public  static  Class forName(String  className)

使用:

          Class  c4 = Class.forName("cn.himi.Person");

          System.out.println(c == c3);// true   雖然擷取Class對象的方式不一樣,但是Class類是抽象總結,自然也表示一個類

特别注意的是:forName方法的參數為全路徑,就是  "包名+類名",就比如這裡的cn.himi.Person

(3)開發時候使用方式3:

為什麼呢? 因為第三種是一個字元串,而不是一個具體的類名。這樣我們就可以把這樣的字元串配置到配置檔案中