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