全部課程
發(fā)布時(shí)間: 2019-06-29 21:14:43
反射的概述
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。
反射機(jī)制可以說(shuō)是Java框架設(shè)計(jì)的靈魂。
其實(shí)反射就是對(duì)一個(gè)類(lèi)進(jìn)行解剖,要想解剖一個(gè)類(lèi),必須先要獲取到該類(lèi)的字節(jié)碼文件對(duì)象。而解剖使用的就是Class類(lèi)中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對(duì)應(yīng)的Class類(lèi)型的對(duì)象.
反射就是把java類(lèi)中的各種成分映射成一個(gè)個(gè)的Java對(duì)象
例如:一個(gè)類(lèi)有:成員變量、方法、構(gòu)造方法、包等等信息,利用反射技術(shù)可以對(duì)一個(gè)類(lèi)進(jìn)行解剖,把個(gè)個(gè)組成部分映射成一個(gè)個(gè)對(duì)象。
(其實(shí):一個(gè)類(lèi)中這些成員方法、構(gòu)造方法、在加入類(lèi)中都有一個(gè)類(lèi)來(lái)描述)
如圖是類(lèi)的正常加載過(guò)程:反射的原理在與class對(duì)象。
熟悉一下加載的時(shí)候:Class對(duì)象的由來(lái)是將class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)Class對(duì)象。
??
其中,在反射機(jī)制中,Class對(duì)象是一個(gè)很特殊的對(duì)象,所以我們先了一下Class對(duì)象
Class類(lèi)在API中的詳解
Class類(lèi)是屬于lang包中的一個(gè)類(lèi),Class類(lèi)的實(shí)例表示的是正在運(yùn)行中的Java應(yīng)用程序中的類(lèi)和接口。也就是JVM中有N個(gè)實(shí)例所對(duì)應(yīng)類(lèi)都有對(duì)應(yīng)的Class對(duì)象。
Class類(lèi)沒(méi)有公共的構(gòu)造方法,也就意味著我們不能手動(dòng)的去創(chuàng)建這個(gè)類(lèi)的對(duì)象,它只能是由JVM創(chuàng)建,我們只需要獲取使用即可。
Class對(duì)象的獲取
獲取Class對(duì)象的三種方式
a)通過(guò)Object類(lèi),調(diào)用getClass()方法獲取
b)任何數(shù)據(jù)類(lèi)型(包括基本數(shù)據(jù)類(lèi)型)都會(huì)有一個(gè)“靜態(tài)”的class屬性
c)通過(guò)Class類(lèi)的靜態(tài)方法獲取:forName(String className)

注意;在運(yùn)行期間,一個(gè)類(lèi),只有Class對(duì)象產(chǎn)生。
三種方式常用第三種,第一種對(duì)象都有了還要反射干什么。第二種需要導(dǎo)入類(lèi)的包,依賴(lài)太強(qiáng),不導(dǎo)包就拋編譯錯(cuò)誤。一般都第三種,一個(gè)字符串可以傳入也可寫(xiě)在配置文件中等多種方法。?