轉載
http://blog.csdn.net/liujiahan629629/article/details/18013523#reply
反射基礎的簡單學習
概念
主要是指程序可以訪問,檢測和修改它本身狀態或行爲的一種能力,並能根據自身行爲的狀態和結果,調整或修改應用所描述行爲的狀態和相關的語義。
反射是java中一種強大的工具,能夠使我們很方便的創建靈活的代碼,這些代碼可以再運行時裝配,無需在組件之間進行源代碼鏈接。但是反射使用不當會成本很高!
作用
- 反編譯:.class–>.java
- 通過反射機制訪問java對象的屬性,方法,構造方法等;
JDK中的相關類
- java.lang.Class;
- java.lang.reflect.Constructor; java.lang.reflect.Field;
- java.lang.reflect.Method;
- java.lang.reflect.Modifier;
具體功能實現:
- 反射機制獲取類有三種方法,我們來獲取Employee類型
Classc1 = Class.forName("Employee");
Classc2 = Employee.class;
Employeee = new Employee();
Classc3 = e.getClass();
- 創建對象:獲取類以後我們來創建它的對象,利用newInstance:
Class c =Class.forName("Employee");
Objecto = c.newInstance();
- 獲取屬性:分爲所有的屬性和指定的屬性:
Class c = Class.forName("java.lang.Integer");
Field[] fs = c.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
for(Field field:fs){
sb.append("\t");
sb.append(Modifier.toString(field.getModifiers())+" ");
sb.append(field.getType().getSimpleName() + " ");
sb.append(field.getName()+";\n");
}
sb.append("}");
System.out.println(sb);
Class c = Class.forName("User");
Field idF = c.getDeclaredField("id");
Object o = c.newInstance();
idF.setAccessible(true);
idF.set(o, "110");
System.out.println(idF.get(o));
}
- 獲取方法,和構造方法,不再詳細描述,只來看一下關鍵字:
方法關鍵字 |
含義 |
getDeclaredMethods() |
獲取所有的方法 |
getReturnType() |
獲得方法的放回類型 |
getParameterTypes() |
獲得方法的傳入參數類型 |
getDeclaredMethod(“方法名”,參數類型.class,……) |
獲得特定的方法 |
構造方法關鍵字 |
含義 |
getDeclaredConstructors() |
獲取所有的構造方法 |
getDeclaredConstructor(參數類型.class,……) |
獲取特定的構造方法 |
父類和父接口 |
含義 |
getSuperclass() |
獲取某類的父類 |
getInterfaces() |
獲取某類實現的接口 |