Java&Android 基礎(chǔ)知識(shí)梳理(13) - 反射

一探橱、什么是反射

在運(yùn)行狀態(tài)中,對(duì)于 任意一個(gè)類(lèi)糠赦,都能夠獲取到這個(gè)類(lèi)的所有屬性和方法梦谜;對(duì)于 任意一個(gè)對(duì)象滴肿,都能夠調(diào)用它的任意一個(gè)方法和屬性感帅,這種動(dòng)態(tài)獲取信息以及調(diào)用對(duì)象方法的功能就稱(chēng)為Java的反射機(jī)制廊散。

要使用反射機(jī)制枣购,就必須先獲取到該類(lèi)的 字節(jié)碼文件對(duì)象 娶耍,通過(guò)字節(jié)碼文件對(duì)象免姿,能夠通過(guò)該類(lèi)中的方法獲取到我們需要的所有信息。

當(dāng)類(lèi)加載的時(shí)候榕酒,會(huì)將.class文件讀入內(nèi)存胚膊,并為它創(chuàng)建一個(gè)Class對(duì)象,它包含了所有相關(guān)的信息想鹰,也就是上面所說(shuō)的 字節(jié)碼文件對(duì)象紊婉。

二、獲取 Class 對(duì)象的方法

  • 通過(guò)Class類(lèi)的靜態(tài)方法杖挣,此時(shí)該類(lèi)還是處于 源文件階段肩榕。
Class clazz1 = Class.forName("限定名");
  • 當(dāng)類(lèi)被加載成.class文件時(shí),此時(shí)Clazz類(lèi)變成了.class惩妇,在獲取該字節(jié)碼文件對(duì)象株汉,也就是獲取自己,該類(lèi)處于 字節(jié)碼階段歌殃。
Class clazz2 = Clazz.class;
  • 通過(guò)類(lèi)的實(shí)例獲取該類(lèi)的字節(jié)碼文件對(duì)象乔妈,該類(lèi)處于 創(chuàng)建對(duì)象階段
Class clazz3 = p.getClass();

三氓皱、使用反射

在我們使用反射的時(shí)候會(huì)涉及到三個(gè)方面:構(gòu)造函數(shù)路召、屬性和方法,以下面這個(gè)類(lèi)為例波材。

/**
 * @author lizejun
 **/
public class ReflectHolder {

    public String openValue;

    private String closeValue;

    private ReflectHolder() {}

    public ReflectHolder(String openValue, String closeValue) {
        this.openValue = openValue;
        this.closeValue = closeValue;
    }

    public void setOpenValue(String openValue) {
        this.openValue = openValue;
    }

    private void setCloseValue(String closeValue) {
        this.closeValue = closeValue;
    }
}

3.1 構(gòu)造函數(shù)

通過(guò)Class類(lèi)獲取構(gòu)造方法股淡,有以下四類(lèi):

  • Constructor[] - getConstructors():所有public構(gòu)造方法。
  • Constructor[] - getDeclaredConstructors():所有構(gòu)造方法廷区,包括public唯灵、protectedprivate隙轻、默認(rèn)埠帕。
  • Constructor - getConstructor(null):無(wú)參構(gòu)造方法。
  • Constructor - getDeclaredConstructor(x.class):參數(shù)為x的構(gòu)造方法玖绿。

通過(guò)其中一種方法敛瓷,我們可以獲取到Constrcutor對(duì)象,并通過(guò)該對(duì)象來(lái)創(chuàng)建實(shí)例:

  • newInstance(Object... args):使用此Constructor對(duì)象表示的構(gòu)造方法來(lái)創(chuàng)建其對(duì)應(yīng)類(lèi)的實(shí)例斑匪,并用指定的參數(shù)args初始化該實(shí)例呐籽。

3.2 屬性

  • Field[] - getFields():所有public屬性。
  • Field[] - getDeclaredFields():所有屬性。
  • Field - getField(屬性名稱(chēng)):獲取對(duì)應(yīng)名稱(chēng)的Field绝淡。

獲取到Field對(duì)象后宙刘,可以通過(guò)Field.set(obj, value)方法苍姜,設(shè)置obj對(duì)象的對(duì)應(yīng)屬性值為value牢酵。

對(duì)于非public屬性,需要先調(diào)用Field. setAccessible(true)解除私有規(guī)定衙猪。

3.3 方法

  • Method[] - getMethods():所有public方法馍乙。
  • Method[] - getDeclaredMethods():所有方法。
  • Method - getMethod("方法名", a.class, b.class, ...):通過(guò)方法名和形參列表.class這兩項(xiàng)來(lái)唯一確定方法垫释。

獲取到Method對(duì)象后丝格,可以通過(guò)Method.invoke(obj, 實(shí)參列表)來(lái)調(diào)用該方法,其返回值就為該方法的返回值棵譬,需要進(jìn)行類(lèi)型強(qiáng)制轉(zhuǎn)換显蝌。

對(duì)于不可訪(fǎng)問(wèn)的方法,需要先調(diào)用Method.setAccessible(true)解除私有規(guī)定订咸。

三曼尊、參考文章

Java 基礎(chǔ)之—反射(非常重要)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脏嚷,隨后出現(xiàn)的幾起案子骆撇,更是在濱河造成了極大的恐慌,老刑警劉巖父叙,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件神郊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趾唱,警方通過(guò)查閱死者的電腦和手機(jī)涌乳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甜癞,“玉大人夕晓,你說(shuō)我怎么就攤上這事〈叮” “怎么了运授?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)乔煞。 經(jīng)常有香客問(wèn)我吁朦,道長(zhǎng),這世上最難降的妖魔是什么渡贾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任逗宜,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺讲。我一直安慰自己擂仍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布熬甚。 她就那樣靜靜地躺著逢渔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乡括。 梳的紋絲不亂的頭發(fā)上肃廓,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音诲泌,去河邊找鬼盲赊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敷扫,可吹牛的內(nèi)容都是我干的哀蘑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葵第,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绘迁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起羹幸,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脊髓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后栅受,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體将硝,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屏镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了依疼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡而芥,死狀恐怖律罢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棍丐,我是刑警寧澤误辑,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站歌逢,受9級(jí)特大地震影響巾钉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秘案,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一砰苍、第九天 我趴在偏房一處隱蔽的房頂上張望潦匈。 院中可真熱鬧,春花似錦赚导、人聲如沸茬缩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凰锡。三九已至,卻和暖如春黍少,著一層夾襖步出監(jiān)牢的瞬間寡夹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工厂置, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魂角。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓昵济,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親野揪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子访忿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容