Java基礎之—反射(非常重要)
**原博主**: http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是架構設計的靈魂 (使用的前提條件:必須先得到代表的位元組碼的Class,Class類用於表示.class檔案(位元組碼))
一、反射的概述 JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要擷取到該類的位元組碼檔案對象。而解剖使用的就是Class類中的方法.所以先要擷取到每一個位元組碼檔案對應的Class類型的對象.
以上的總結就是什麼是反射 反射就是把java類中的各種成分映射成一個個的Java對象 例如:一個類有:成員變數、方法、構造方法、包等等資訊,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。 (其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述) 如圖是類的正常載入過程:反射的原理在與class對象。 熟悉一下載入的時候:Class對象的由來是將class檔案讀入記憶體,並為之建立一個Class對象。
其中這個Class對象很特殊。我們先瞭解一下這個C lass類
二、查看Class類在java中的api詳解(1.7的API) 如何閱讀java中的api詳見java基礎之——String字串處理
Class 類的執行個體表示正在啟動並執行 Java 應用程式中的類和介面。也就是jvm中有N多的執行個體每個類都有該Class對象。(包括基礎資料型別 (Elementary Data Type)) Class 沒有公用構造方法。Class 對象是在載入類時由 JAVA 虛擬機器以及通過調用類載入器中的defineClass 方法自動構造的。也就是這不需要我們自己去處理建立,JVM已經幫我們建立好了。
沒有公用的構造方法,方法共有64個太多了。下面用到哪個就詳解哪個吧
三、反射的使用(這裡使用Student類做示範) 先寫一個Student類。
1、擷取Class對象的三種方式 1.1 Object ——> getClass();
1.2 任何資料類型(包括基礎資料型別 (Elementary Data Type))都有一個“靜態”的class屬性
1.3 通過Class類的靜態方法:forName(String className)(常用)
其中1.1是因為Object類中的getClass方法、因為所有類都繼承Object類。從而調用Object類來擷取
[java] view plain copy <span style=“font-size:18px;”>package fanshe; /** * 擷取Class對象的三種方式 * 1 Object ——> getClass(); * 2 任何資料類型(包括基礎資料型別 (Elementary Data Type))都有一個“靜態”的class屬性 * 3 通過Class類的靜態方法:forName(String className)(常用) * */ public class Fanshe { public static void main(String[] args) { //第一種方式擷取Class對象 Student stu1 = new Student();//這一new 產生一個Student對象,一個Class對象。 Class stuClass = stu1.getClass();//擷取Class對象 System.out.println(stuClass.getName()); //第二種方式擷取Class對象 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2);//判斷第一種方式擷取的Class對象和第二種方式擷取的是否是同一個 //第三種方式擷取Class對象 try { Class stuClass3 = Class.forName(”fanshe.Student”);//注意此字串必須是真實路徑,就是帶包名的類路徑,包名.類名 System.out.println(stuClass3 == stuClass2);//判斷三種方式是否擷取的是同一個Class對象 } catch (ClassNotFoundException e) { e.printStackTrace(); } } }</span> [java] view plain copy