??? 面對Java反射機制,會有種令人敬畏而又好奇的感覺,覺得非常強大,深不可測!呵,其實是懶惰的表現,總是找借口和理由不去深入學習這些東西,覺得實際開發(fā)中很少會用到,能混就混混吧。真該死。
??? 下面就來淺談下反射,也總結下這幾天學習的心得,僅供個人總結,不足之處請大家看在小弟能力有限學習未深的份上多多包涵呵。?
??? 每個class都其實都對應一個Class對象,該對象就包含在我們編寫完一個類編譯之后在相應的路徑下產生一個.class文件中,該Class對象就用于表示這個類的類型信息。在運行期間,如果我們要產生某個類的對象,Java虛擬機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class文件并加載它。一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象。
??? OK,初步了解了以上類的被加載機制后,我們就開談Java Reflect的樂趣吧。
??? Java不是動態(tài)語言,但是通過java reflect我們可以實現類似動態(tài)語言的特性,靠的是什么?就是java reflect API,而java reflect 靠的是什么?其根本就是從每個類所對應的Class對象中所定義的各種方法。也就是說,要想對某個類使用反射機制動態(tài)對其進行某些特殊操作,我們必須先獲取該類所對象的Class對象,它就是反射的一個入口,怎么樣來獲取Class對象呢?有以下幾種常用的方法:
??? 1、利用對象調用getClass()方法獲取該對象的Class實例。打開JDK文檔,該方法定義在Object類中,也就是說,java中所有的類都擁有該方法,因為java中任何對象都是延伸自Object父類的。該方法返回Class對象,如果類型不確定,可以使用泛型Class<?>
???? 2、使用Class類的靜態(tài)方法forName(),用類的全路徑名字獲取一個Class實例。這個方法就不用多說了呵,初學Java JDBC時我們就用過,典型的反射應用。
???? 3、運用.class的方式來獲取Class實例,如(類名.class),對于基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例。int.class ,Integre.class ,Integer.TYPE)
??? 好了,現在我們得到了一個類的Class對象了,那么該怎么下手哩?仔細想想,我們在定義一個類的時候,無非只有四種存在,
??? 1、Field : 屬性
??? 2、Constructor : 構造子
??? 3、Method : 方法
??? 4、Array : 可能會定義的數組
??? 以上幾種就是我們在類定義的時候類中存在最基本的元素,但反射是在運行時對類對象進行操作的,所以我們也有可能需要對某個屬性或方法的訪問權限進行獲取,以對該對象更全面的了解,所以Modifier的獲取也是必然的。
??? 請打開JDK文檔的java.lang.reflect包,該包下就會找到上述幾個東東,原來在該反射包中,它們都被定義成類了,并且在每個類中都定義了對其操作的各種方法。有人可能要問了,這幾個類跟Class對象有什么關系?呵,關系大了去了,比如Constructor是構造方法類,它一般用于構造某個帶參構造器類的對象的時候使用,比如某個類只提供了一個帶參構造器,這時就需要使用該類的Class對象的getConstructor()方法返回Constructor對象,再用該對象的newInstance()方法來構造該類。也就是說,以上幾個類,都是基于Class對象來對某個類進行操作的。
??? 總之,Class代表的是類對象,上述幾個類可以看成是工具,我想怎么去對一個類對象在運行時進行操作,就是依靠該類的Class對象來告訴上述幾個類:“我想讓你(Field、Constructor、Method、Array、Modifier等)告訴我此時我代表的這個對象的某些信息,因為我要在這個運行時刻對它進行一些操作!”
??? 所以,在java反射中,只要把這幾個類的關系及其作用弄清楚之后,對java反射也就有了一個大致的了解了,對于一些架構或是開源框架的一些“智能”也就不會感到那么高深莫測了呵。其實java reflect技術是java中的核心機制,十分重要。小弟不才,說了半天沒表達清楚什么,繼續(xù)努力!
????
??? 下面就來淺談下反射,也總結下這幾天學習的心得,僅供個人總結,不足之處請大家看在小弟能力有限學習未深的份上多多包涵呵。?

??? 每個class都其實都對應一個Class對象,該對象就包含在我們編寫完一個類編譯之后在相應的路徑下產生一個.class文件中,該Class對象就用于表示這個類的類型信息。在運行期間,如果我們要產生某個類的對象,Java虛擬機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class文件并加載它。一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象。
??? OK,初步了解了以上類的被加載機制后,我們就開談Java Reflect的樂趣吧。
??? Java不是動態(tài)語言,但是通過java reflect我們可以實現類似動態(tài)語言的特性,靠的是什么?就是java reflect API,而java reflect 靠的是什么?其根本就是從每個類所對應的Class對象中所定義的各種方法。也就是說,要想對某個類使用反射機制動態(tài)對其進行某些特殊操作,我們必須先獲取該類所對象的Class對象,它就是反射的一個入口,怎么樣來獲取Class對象呢?有以下幾種常用的方法:
??? 1、利用對象調用getClass()方法獲取該對象的Class實例。打開JDK文檔,該方法定義在Object類中,也就是說,java中所有的類都擁有該方法,因為java中任何對象都是延伸自Object父類的。該方法返回Class對象,如果類型不確定,可以使用泛型Class<?>
???? 2、使用Class類的靜態(tài)方法forName(),用類的全路徑名字獲取一個Class實例。這個方法就不用多說了呵,初學Java JDBC時我們就用過,典型的反射應用。
???? 3、運用.class的方式來獲取Class實例,如(類名.class),對于基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例。int.class ,Integre.class ,Integer.TYPE)
??? 好了,現在我們得到了一個類的Class對象了,那么該怎么下手哩?仔細想想,我們在定義一個類的時候,無非只有四種存在,
??? 1、Field : 屬性
??? 2、Constructor : 構造子
??? 3、Method : 方法
??? 4、Array : 可能會定義的數組
??? 以上幾種就是我們在類定義的時候類中存在最基本的元素,但反射是在運行時對類對象進行操作的,所以我們也有可能需要對某個屬性或方法的訪問權限進行獲取,以對該對象更全面的了解,所以Modifier的獲取也是必然的。
??? 請打開JDK文檔的java.lang.reflect包,該包下就會找到上述幾個東東,原來在該反射包中,它們都被定義成類了,并且在每個類中都定義了對其操作的各種方法。有人可能要問了,這幾個類跟Class對象有什么關系?呵,關系大了去了,比如Constructor是構造方法類,它一般用于構造某個帶參構造器類的對象的時候使用,比如某個類只提供了一個帶參構造器,這時就需要使用該類的Class對象的getConstructor()方法返回Constructor對象,再用該對象的newInstance()方法來構造該類。也就是說,以上幾個類,都是基于Class對象來對某個類進行操作的。
??? 總之,Class代表的是類對象,上述幾個類可以看成是工具,我想怎么去對一個類對象在運行時進行操作,就是依靠該類的Class對象來告訴上述幾個類:“我想讓你(Field、Constructor、Method、Array、Modifier等)告訴我此時我代表的這個對象的某些信息,因為我要在這個運行時刻對它進行一些操作!”
??? 所以,在java反射中,只要把這幾個類的關系及其作用弄清楚之后,對java反射也就有了一個大致的了解了,對于一些架構或是開源框架的一些“智能”也就不會感到那么高深莫測了呵。其實java reflect技術是java中的核心機制,十分重要。小弟不才,說了半天沒表達清楚什么,繼續(xù)努力!
????
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
