反射之中包含了乙個「反」字,所以想要解釋反射就必須先從「正」開始解釋。
一般情況下,我們使用某個類時必定知道它是什麼類,是用來做什麼的。於是我們直接對這個類進行例項化,之後使用這個類物件進行操作。
上面這樣子進行類物件的初始化,我們可以理解為「正」。
而反射則是一開始並不知道我要初始化的類物件是什麼,自然也無法使用 new 關鍵字來建立物件了。
這時候,我們使用 jdk 提供的反射 api 進行反射呼叫:
method method = clz.getmethod("setprice", int.class);
constructor constructor = clz.getconstructor();
object object = constructor.newinstance();
method.invoke(object, 4);
所以說什麼是反射?
反射就是在執行時才知道要操作的類是什麼,並且可以在執行時獲取類的完整構造,並呼叫對應的方法。
乙個簡單的例子
上面提到的示例程式,其完整的程式**如下:
private int price;
public int getprice()
public void setprice(int price)
public static void main(string args) throws exception}
從**中可以看到我們使用反射呼叫了 setprice 方法,並傳遞了 14 的值。之後使用反射呼叫了 getprice 方法,輸出其**。上面的**整個的輸出結果是:
從這個簡單的例子可以看出,一般情況下我們使用反射獲取乙個物件的步驟:
-獲取類的 class 物件例項
-根據 class 物件例項獲取 constructor 物件
-使用 constructor 物件的 newinstance 方法獲取反射類物件
而如果要呼叫某乙個方法,則需要經過下面的步驟:
獲取方法的 method 物件
method setpricemethod = clz.getmethod("setprice", int.class);
-利用 invoke 方法呼叫方法 反射學習系列1 反射入門
反射學習系列目錄 反射學習系列1 反射入門 反射學習系列2 特性 attribute 反射學習系列3 反射例項應用 作者 reflection,中文翻譯為反射。這是.net中獲取執行時型別資訊的方式,net的應用程式由幾個部分 程式集 assembly 模組 module 型別 class 組成,而...
反射學習系列1 反射入門
反射學習系列目錄 反射學習系列1 反射入門 反射學習系列2 特性 attribute 反射學習系列3 反射例項應用 作者 reflection,中文翻譯為反射。這是.net中獲取執行時型別資訊的方式,net的應用程式由幾個部分 程式集 assembly 模組 module 型別 class 組成,而...
java中反射的原理
簡單的回憶下,下次做具體的分析。首先有乙個反射包,這個包裡有這些類,方法類 放類裡的一些方法,構造方法類,放構造方法資訊 欄位類,放類的一些字段資訊,class類,這個類的型別資訊,乙個類在編譯完後會形成乙個.class檔案,這個檔案裡會有乙個class類存放這個類的型別資訊。執行期間,我們如果要產...