反射機制與原理筆記 聲明
文章均為本人技術筆記,轉載請注明出處https://segmentfault.com/u/yzwall
反射機制反射:當程序無法獲知對象類型時,在運行期間動態獲取類的所有屬性和方法,這種動態獲取類信息和動態調用對象方法的功能稱為反射機制;
反射機制實現:Class類與java.lang.reflect類庫一起實現<反射>機制,
java.lang.reflect類庫包含Field/Method/Constructors類。這些類型的對象由JVM在運行時出創建,分別用于獲取未知類的域/方法/構造器:
通過Class類和java.lang.reflect類包,未知對象的類信息在運行時被確定,并且在編譯時無需獲取;
RTTI,runtime type information/運行時類型信息,JVM運行時負責記錄一個對象的屬性;
運行期間,Java通過Class對象記錄每個對象的RTTI;每當編寫并且編譯一個新類時,就會產生一個對應的Class對象(和新類保存在一個同名的.class文件中)
JVM通過類加載器創建類的對象實例類加載器首先檢查類的Class對象是否加載,未加載的話從類的.class文件中加載;
一旦類的Class對象被載入內存,它就被用來創建類的所有對象;
java.lang.reflect類reflect包提供以下類供反射使用,解析目標類:
Class類:代表一個目標類;
Field類:代表目標類的成員變量;
Method類:代表目標類的方法。
Constructor類:代表目標類的構造方法。
Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法;
反射步驟 獲得目標類的java.lang.Class對象 已獲得目標類對象實例// Object類 public final native Class> getClass();
如果已獲得目標類對象實例,通過目標類對象實例.getClass()返回該類Class對象;
已獲得目標類名假設目標類名為myClass, 通過Class c = myClass.getClass()獲得該類Class對象;
目標類名在編譯器不確定,在運行期確定如果目標類名在編譯器不確定,在運行期可以確定,使用Class.forName(目標類名)獲取該類Class對象,要求目標類名必須是全限定;
Class.forName(目標類名)內部通過反射API根據目標類名將類手動加載到內存中,稱為類加載器加載方法。加載過程中會把目標類的static方法,變量,代碼塊加載到JVM,注意此時尚未創建對象實例;
Object newInstance():通過調用默認構造器創建一個對象實例,
獲得構造器反射機制只能調用無參的構造器創建對象;
Constructor[] getConstructors():獲得所有public構造器;
Constructor[] getDeclaredConstructors():獲得所有訪問權限的構造器
Constructor getConstructor(Class[] params):根據指定參數獲得對應構造器;
Constructor getDeclaredConstructor(Class[] params):根據指定參數獲得對應構造器;
獲得方法Method[] getMethods():獲得所有public方法;
Method[] getDeclaredMethods():獲得所有訪問權限的方法;
Method getMethod(String name, Class[] params):根據方法簽名獲取類自身對應public方法,或者從基類繼承和接口實現的對應public方法;
Method getDeclaredMethod(String name, Class[] params):根據方法簽名獲得對應的類自身聲明方法,訪問權限不限;
獲得變量Field[] getFields():獲得類中所有public變量
Field[] getDeclaredFields():獲得類中所有訪問權限變量
Field getField(String name):根據變量名得到對應的public變量
Field getDeclaredField(String name):根據變量名獲得對應的變量,訪問權限不限;
反射應用廣泛應用于對象序列化和JavaBean中;
eclipse等IDE補全機制:eclipse等IDE在代碼構建對象時,通過反射機制自動把該對象能使用的方法和屬性全部列出來,供用戶選擇;
參考[1] http://blog.csdn.net/jojo52013145/article/details/5801962
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66983.html
摘要:再附一部分架構面試視頻講解本文已被開源項目學習筆記總結移動架構視頻大廠面試真題項目實戰源碼收錄 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava異常詳解Java抽象類和接口的區別Java深拷貝和淺拷...
摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎及深入知識點,技術博客,學習筆記等等,還包括平時開發中遇到的匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續完善開源的文件是格式的同時也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技...
摘要:純分享直接上干貨操作系統并發支持進程管理內存管理文件系統系統進程間通信網絡通信阻塞隊列數組有界隊列鏈表無界隊列優先級有限無界隊列延時無界隊列同步隊列隊列內存模型線程通信機制內存共享消息傳遞內存模型順序一致性指令重排序原則內存語義線程 純分享 , 直接上干貨! 操作系統并發支持 進程管理內存管...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 1669·2021-11-17 09:33
閱讀 3531·2021-11-16 11:40
閱讀 3055·2019-08-30 11:23
閱讀 1048·2019-08-29 16:36
閱讀 2464·2019-08-29 13:23
閱讀 1738·2019-08-29 12:59
閱讀 1542·2019-08-29 12:42
閱讀 1979·2019-08-28 18:22