反射機制是Java語言中很重要的特性,是在運行時獲知對象信息,並可在運行時操作對象的機制。
反射(Reflect), 顧名思義,通過Java對象的Class信息,可以逆向生成對象、探知運行時的對象信息、調用對象方法,一種可以反向作用的機制。
反射的用途:
1. 在運行時獲取任意對象所屬的類對象
Class<?> clazz = Class.forName(String className);
2. 在運行時構造任意類的對象
Object obj = clazz.newInstance();
3. 在運行時獲取任意類所具有的成員變量和方法
field.set(Object obj, Object value);
field.get(Object obj);
4. 在運行時調用任意對象的方法 (最常見的需求,尤其是當該方法是私有方法或者隱藏方法)
method.invoke(Object obj, Object... args);
通過反射機制,已知的應用有:
1. ORM框架使用了反射機制,來實現對象和數據表的映射關係;
2. 動態代理中使用反射機制,動態生成代理角色,這樣比較好地解決了靜態代理的代碼膨脹問題。
常用的獲取類信息方法:
1. 獲取類對象
Class clazz = obj.getClass();
或 Class clazz = Class.forName(${className});
2. 獲取對象中聲明的方法:
Method[] methods = clazz.getDeclaredMethods();
3. 獲取對象的屬性數據:
Field[] fields = clazz.getDeclaredFields();
動態執行對象的方法:
1. Method.invoke() 動態執行對象的方法
如果是私有方法,先把Method的可見性設爲true,然後再調用。
method.setAccessible(true);
2. Field.setXXX() 動態設置對象的屬性
總結:
反射機制使Java語言在很大程序上增強了靈活性,在語言的動態的功能擴展上有了更多的想象力和空間。