先貼上Java反射機制的概念:
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意一個方法和屬性;
這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
這么一講很強大有沒有!
反射的機制的實現還有仰仗Class類,因為想要剖析一個類就必須先要獲取到該類的字節碼文件對象,而Class類用於表示.class文件(字節碼)
而且從獲取到剖析使用的都是Class類的方法。
獲取類字節碼方法有三種:
1、通過實例化對象的 stu.getClass() 獲取到字節碼文件
getClass()方法其實是Object的一個方法,Class繼承了Object,所以我們可以直接使用。
public class Test01 { public static void main(String[] args) { Student stu=new Student(); Class c=stu.getClass(); System.out.println(c.getName()); } }
結果:com.reflection.model.Student
當然這種方法沒什么意義,因為我們都 new 實例化對象了,就沒有必要反射了。
2、通過類的 .class 屬性獲取類的字節碼文件
import com.reflection.model.Student; public class Test02 { public static void main(String[] args) { Class c= Student.class; System.out.println(c.getName()); } }
結果:com.reflection.model.Student
這種方法比第一種方法稍好,當也有不足之處,因為需要導入類的包,這樣做依賴性太強,不利於解耦。
3、通過類的全路徑名獲取Class對象 使用Class.forName("全路徑名")來實現
此處可能會報出 ClassNotFoundException 異常因為 你給的全路徑名可能不存在,因此給他加一個try{}cath(){}
public class Test03 { public static void main(String[] args) { try { Class c=Class.forName("com.reflection.model.Student"); System.out.println(c.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
結果:com.reflection.model.Student
比較前兩個方法我們可以看出第三種方法才是我們需要的。
雖然這里用是 全路徑名 輸出的結果也是 全路徑名,但取到的是一個 類的字節碼文件,可以用它做很多事。
下一篇將會講到 :獲取 類 的 方法 和 屬性(包括構造函數)