1.反射機制的理解 在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法 對於任意一個對象,都能夠調用它的任意一個方法和屬性 類中有什麼信息,利用反射機制就能可以獲得什麼信息,不過前提是得知道類的名字 2.反射機制的作用 在運行時判斷任意一個對象所屬的類; 在運行時獲取類的實例對象; 在運 ...
1.反射機制的理解
- 在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法
- 對於任意一個對象,都能夠調用它的任意一個方法和屬性
- 類中有什麼信息,利用反射機制就能可以獲得什麼信息,不過前提是得知道類的名字
2.反射機制的作用
- 在運行時判斷任意一個對象所屬的類;
- 在運行時獲取類的實例對象;
- 在運行時訪問對象的屬性,方法,構造方法等;
- 結合工廠模式實現了Spring中的IoC。
3.反射機制的應用背景
反射機制實現了動態創建對象和編譯,體現出很大的靈活性。對於一個大型的軟體來說,不可能一次就把它設計的很完美,當這個程式編譯後,發佈了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟體肯定是沒有多少人用的。採用靜態的話,需要把整個程式重新編譯一次才可以實現功能的更新,而採用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。
4.反射機制的示例
先創建一個Person類,包括成員屬性、成員方法。
1 public class Person { 2 3 public String name; 4 5 public void run() { 6 System.out.println("This person is running!"); 7 } 8 9 }
通過反射機制獲取Person類的信息,並且訪問和調用成員屬性和成員方法。
1 import java.lang.reflect.Field; 2 import java.lang.reflect.InvocationTargetException; 3 import java.lang.reflect.Method; 4 5 /* 6 * java中的反射機制解析: 7 * 1.通過反射機制,可以在程式運行時獲取類的信息 8 * 方法:通過類名.class得到 9 * 通過Object的getClass()方法得到,適用於不知道類型的情況 10 * 通過全類名獲取,用的比較多 11 * 2.通過反射機制創建實例對象、獲取成員方法、調用成員方法、獲取成員屬性、設置屬性 12 * 註意:反射機制 + 工廠模式 = Spring中的IoC 13 */ 14 public class ReflectTest { 15 16 public static void main(String[] args) 17 throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, 18 InvocationTargetException, NoSuchFieldException, InstantiationException, IllegalAccessException { 19 Class clazz = null; 20 21 // 通過類名.class得到 22 clazz = Person.class; 23 System.out.println("通過類名得到:" + clazz); 24 25 // 通過Object的getClass()方法得到,適用於不知道類型的情況 26 Object obj = new Person(); 27 clazz = obj.getClass(); 28 System.out.println("通過getClass方法得到:" + clazz); 29 30 // 通過全類名獲取,用的比較多,但是會拋出ClassNotFoundException異常 31 clazz = Class.forName("codeAnal.Person"); 32 System.out.println("通過全類名獲取:" + clazz); 33 34 /* 35 * 創建實例化對象、獲取方法、調用方法、獲取屬性、設置屬性 36 * 註意此處需要拋出異常 37 */ 38 // 獲取實例化對象 39 Object object = clazz.newInstance(); 40 System.out.println("實例對象" + object); 41 // 獲取類中的方法 42 Method method = clazz.getDeclaredMethod("run"); 43 System.out.println("方法:" + method); 44 // 調用類中的方法 45 method.invoke(object); 46 // 獲取屬性 47 Field field = clazz.getDeclaredField("name"); 48 // 設置屬性 49 field.setAccessible(true); 50 field.set(object, "張三"); 51 System.out.println("人名:" + field.get(object)); 52 53 } 54 }
本文只是簡單介紹了一下Java中的反射機制,詳細瞭解請參考:http://www.cnblogs.com/Eason-S/p/5851078.html