Java中反射(Reflection)就是對類信息的元數據的描述與操作,首先是對加載的類的信息的獲得,其次是實例化和操作對象。
類信息有java.lang.Class提供描述。Class對象由三種方法獲得,第一是調用對象的getClass()方法;第二是直接使用類的.class形式;第三是直接使用Class.forName(String)的形式;
和反射打交道使用較多的類是java.lang.reflect.Method、Field、Constructor分別對應方法調用、屬性與屬性修改、構造函數使用三個方面,具體api查看文檔;數組類型比較特殊具體參考java.lang.reflect.Array。
關于反射的兩個誤解:反射代碼速度很慢;反射代碼都是復雜的;
――――如果使用得當,反射不會降低性能,正確的使用反射實際上應該改進代碼的可維護性。反射的直接使用應該僅局限于基礎機構類,不應該被分散到應用對象中。(Rod Johnson)
反射的api學習不是關鍵,關鍵是掌握其本質,并能夠在實際中合適的使用它。掌握反射是一個認真的java程序員該做到的。實際中已用到的反射的例子:struts中formbean從請求中自動填充、apache的BeanUtil包;struts中DispatchAction根據參數傳遞的方法名字動態調用本實例的具體方法;工廠模式中根據參數傳遞的類名來動態加載并實例化一個產品。
動態代理
是jdk1.3提供的一種在運行時實現特定接口并生成相應代理實現,從而可以截取對該接口實現的調用。截取對每個實現方法的調用對處理提供了很大的空間,你可以在方法調用前后進行相關的處理,同時還可以隨意調用非實現對象的方法。這種截取適用于資源的獲得和釋放、記錄日志、獲取性能信息等情況。動態代理是一種Aspect Oriented Programming (AOP)的實現,同時經常在容器和服務器級別使用。
實際使用動態代理的例子:代理Connection來自動關閉該連接打開的Statement;在業務方法前后添加日志記錄。