---------------------- android培訓、java培訓、期待與您交流! ----------------------
學習到了反射的知識,我不由的感慨,反射是在是太強大了,
首先我們必須瞭解什麼是java的反射機制,反射機制就是在運行狀態中,對於任意的一個類,都能夠知道這個類的所有屬性和方法,這種動態擷取資訊的方法的功能稱為java語言的反射機制,也可以認為反射就是把java類中的各種成分映射成java類,就是java中每個類,方法,屬性都有對應的類,都是該類的執行個體對象。
現在來看一個例子
class A{private String name;public A(String name){This.name = name ;}public void setName(String name){this.name = name;}public String getName(){return name;}}
現在我們想要調用類A中的方法,可以這樣
A a = new A(“welen”);a.setName("welenwho");System.out.println(a.getName());
這是平常使用的靜態擷取的方法
下面看一下反射機制下動態擷取的方法
Constructor c = Class.forName("A").getConstructor(String.class);A p = (A)c.newInstance(“welen”);Method m = Class.forName("A").getMethod("setName", String.class);m.invoke(p, "welenwho");Method ms = Class.forName("A").getMethod("getName");System.out.println(ms.invoke(p));
或許現在你還看不出反射機制動態擷取的特別,而且代碼有多又複雜,為什麼要使用反射呢?那麼我們可以來看一個有趣的例子
首先定義一個泛型集合
ArrayList<Integer> list = new ArrayList<Integer>();
這時,你想要若想要這麼做
List.add(“welen”);
那是不可能的,泛型已經把list集合的元素鎖定為integer類型中,任何非integer的類型想要到list集合中都是非法的,編譯器首先就要報錯,那麼,我就是要將一個字串類型的資料載入到list集合中是不是就是不可能的?答案是否定的,因為我們知道,編譯器在將源檔案編譯成class檔案的時候,泛型確定的資料類型就會被丟棄,所有,我們可以越過編譯期,在運行期的時候才載入字串類型的資料到list集合中,那樣泛型的鎖定也就不存在了,反射就可以很容易的實現這個功能:
Method m = Class.forName("java.util.ArrayList").getMethod("add", Object.class);m.invoke(list, "welen");System.out.println(list.get(0));
這樣,我們就可以越過泛型的限制(這個時候不要想那麼還要泛型有什麼用啊,這個只是舉例,特殊情況特殊處理,呵呵),那麼現在知道反射的作用了嗎,其中一個作用就是讓一個類執行個體化和方法的實現跳過編譯期而在運行期才實現,這樣做的好處就是程式的靈活性得到提高。
---------------------- android培訓、java培訓、期待與您交流! ----------------------
詳細請查看:edu.csdn.net/heima