JAVA反射機(jī)制

一、什么叫反射?

首先給個定義:

? ? JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個實(shí)體類,都能夠知道這個類的所有屬性和方法验烧;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性又跛;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機(jī)制碍拆。

?? 什么意思呢,簡單來說就是通過反射慨蓝,我們在程序運(yùn)行時可以獲得程序或者程序集中每一個類型的成員和成員信息感混。
?? java程序中的一般的對象的類型都是在編譯期就確定了下來,而java的反射機(jī)制可以動態(tài)地(在運(yùn)行期)創(chuàng)建對象并調(diào)用其屬性礼烈,這里創(chuàng)建的對象的類型在編譯期是未知的弧满。

反射的核心是JVM在運(yùn)行時才動態(tài)加載類或調(diào)用方法/訪問屬性,它不需要事先(寫代碼的時候或編譯期)知道運(yùn)行對象是誰此熬。

反射機(jī)制提供的功能:

1.在運(yùn)行時判斷任意一個對象所屬的類庭呜;
2.在運(yùn)行時構(gòu)造任意一個類的對象;
3.在運(yùn)行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法)犀忱;
4.在運(yùn)行時調(diào)用任意一個對象的方法




二募谎、反射的用途

那么說了一堆,反射的到底能干什么呢峡碉?

在java EE 的世界里,反射機(jī)制最大的作用就是支持==以聲明式的方法(在XML中)來描述應(yīng)用的行為==驮审,是Struts,Spring ,Hibernate 核心技術(shù)之一鲫寄。

舉個栗子:
【Struts的例子:】在運(yùn)用Struts 2框架的開發(fā)中我們一般會在struts.xml里去配置Action吉执,比如:

  1. 在XML配置文件中定義Action
<action name="HelloWorld" class="example.HelloWorld">        
        <result>/hello.jsp</result>  
</action
  1. 定義Java 類
public class HelloWorld extends ExampleSupport {  

    public String execute() throws Exception {    

        ......

        return SUCCESS;                           

    }  

    .......

}

配置文件與Action建立了一種映射關(guān)系,當(dāng)View層發(fā)出請求時地来,請求會被StrutsPrepareAndExecuteFilter攔截戳玫,然后StrutsPrepareAndExecuteFilter會去動態(tài)地創(chuàng)建Action實(shí)例。

Struts 框架的作者事先肯定不知道你會配置一個HelloWorld的Action 未斑。

不過他可以這么做咕宿, Struts 在啟動以后,解析你配置XML配置文件蜡秽, 發(fā)現(xiàn)名稱為HelloWorld的Action, 找到相對于的類名example.HelloWorld, 然后就可以通過反射去實(shí)例化這個類府阀。 等到有人調(diào)用這個action 的時候, 可以通過反射來調(diào)用HelloWorld的execute() 方法芽突。



三试浙、反射基礎(chǔ):關(guān)于class類

1、Class是一個類寞蚌,一個描述類的類(也就是描述類本身)田巴,封裝了描述方法的Method,描述字段的Filed挟秤,描述構(gòu)造器的Constructor等屬性

2壹哺、對象照鏡子后(反射)可以得到的信息:某個類的數(shù)據(jù)成員名、方法和構(gòu)造器艘刚、某個類到底實(shí)現(xiàn)了哪些接口管宵。

3、對于每個類而言昔脯,JRE 都為其保留一個不變的 Class 類型的對象啄糙。一個Class對象包含了特定某個類的有關(guān)信息。

4云稚、Class 對象只能由系統(tǒng)建立對象

5隧饼、一個類在 JVM 中只會有一個Class實(shí)例

//總結(jié)一下就是,JDK有一個類叫做Class静陈,這個類用來封裝所有Java類型燕雁,包括這些類的所有信息,JVM中類信息是放在方法區(qū)的鲸拥。

//所有類在加載后拐格,JVM會為其在堆中創(chuàng)建一個Class<類名稱>的對象,并且每個類只會有一個Class對象刑赶,這個類的所有對象都要通過Class<類名稱>來進(jìn)行實(shí)例化捏浊。

//上面說的是JVM進(jìn)行實(shí)例化的原理,當(dāng)然實(shí)際上在Java寫代碼時只需要用 類名稱就可以進(jìn)行實(shí)例化了撞叨。

//總結(jié)一下就是金踪,JDK有一個類叫做Class浊洞,這個類用來封裝所有Java類型,包括這些類的所有信息胡岔,JVM中類信息是放在方法區(qū)的法希。

//所有類在加載后,JVM會為其在堆中創(chuàng)建一個Class<類名稱>的對象靶瘸,并且每個類只會有一個Class對象苫亦,這個類的所有對象都要通過Class<類名稱>來進(jìn)行實(shí)例化。

//上面說的是JVM進(jìn)行實(shí)例化的原理怨咪,當(dāng)然實(shí)際上在Java寫代碼時只需要用 類名稱就可以進(jìn)行實(shí)例化了屋剑。

public final class Class<T> implements java.io.Serializable,
                          GenericDeclaration,
                          Type,
                          AnnotatedElement {
虛擬機(jī)會保持唯一一
            //通過類名.class獲得唯一的Class對象。
            Class<UserBean> cls = UserBean.class;
            //通過integer.TYPEl來獲取Class對象
            Class<Integer> inti = Integer.TYPE;
          //接口本質(zhì)也是一個類惊暴,一樣可以通過.class獲取
            Class<User> userClass = User.class;




四饼丘、反射的基本運(yùn)用

一、使用反射機(jī)制創(chuàng)建實(shí)例辽话,并調(diào)用其方法

示例類:

package com.example;

public class HelloWorld {

    public HelloWorld(){

    }

    public void sayHello(){

        System.out.println("hello world!");

    }

}

//第一步肄鸽, 先把HelloWorld的類裝載進(jìn)來

Class cls = Class.forName("com.example.HelloWorld");

//第二步, 創(chuàng)建一個HelloWorld的實(shí)例油啤, 注意典徘, 這里并沒有用強(qiáng)制轉(zhuǎn)型把obj轉(zhuǎn)成HelloWorld

Object obj = cls.newInstance();

//第三步, 得到這個類的方法益咬, 注意逮诲, 一個類的方法也是對象啊

Method m = cls.getDeclaredMethod("sayHello");

//第四步, 方法調(diào)用幽告, 輸出"hello world"

m.invoke(obj);




二梅鹦、更多基本應(yīng)用:參考這里
1.判斷是否為某個類的實(shí)例
2.獲取某個class對象的方法集合
3.為某個class對象創(chuàng)建實(shí)例
4.獲取構(gòu)造器的信息
5.調(diào)用方法
6.獲取class類的成員變量





文章主要參考:(謝謝!H咚F胨簟!6澈印)

作者 :老劉 碼農(nóng)翻身

作者:程序員江湖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箍邮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叨叙,更是在濱河造成了極大的恐慌锭弊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擂错,死亡現(xiàn)場離奇詭異味滞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門剑鞍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刹悴,“玉大人,你說我怎么就攤上這事攒暇。” “怎么了子房?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵形用,是天一觀的道長。 經(jīng)常有香客問我证杭,道長田度,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任解愤,我火速辦了婚禮镇饺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘送讲。我一直安慰自己奸笤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布哼鬓。 她就那樣靜靜地躺著监右,像睡著了一般。 火紅的嫁衣襯著肌膚如雪异希。 梳的紋絲不亂的頭發(fā)上健盒,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音称簿,去河邊找鬼扣癣。 笑死,一個胖子當(dāng)著我的面吹牛憨降,可吹牛的內(nèi)容都是我干的父虑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼券册,長吁一口氣:“原來是場噩夢啊……” “哼频轿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烁焙,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤航邢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骄蝇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膳殷,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赚窃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片册招。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勒极,靈堂內(nèi)的尸體忽然破棺而出是掰,到底是詐尸還是另有隱情,我是刑警寧澤辱匿,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布键痛,位于F島的核電站,受9級特大地震影響匾七,放射性物質(zhì)發(fā)生泄漏絮短。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一昨忆、第九天 我趴在偏房一處隱蔽的房頂上張望丁频。 院中可真熱鬧,春花似錦邑贴、人聲如沸席里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁勺。三九已至,卻和暖如春独旷,著一層夾襖步出監(jiān)牢的瞬間署穗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工嵌洼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留案疲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓麻养,卻偏偏與公主長得像褐啡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳖昌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法备畦,類相關(guān)的語法,內(nèi)部類的語法许昨,繼承相關(guān)的語法懂盐,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 1.理解反射的基礎(chǔ):Class類 眾所周知Java有個Object 類糕档,是所有Java 類的繼承根源莉恼,其內(nèi)聲明了數(shù)...
    Cat9527閱讀 535評論 1 5
  • 問題: 在運(yùn)行時,對一個JAVA類,能否知道屬性和方法俐银;能否調(diào)用它的任意方法尿背? 答案是可以的,JAVA提供一種反射...
    糖寶_閱讀 760評論 0 1
  • 健康長壽恐怕是每個人都渴望追求的目標(biāo)捶惜。也是個老生常談的話題田藐。想必每個人都能說出個一二來。比如說吱七,多吃蔬菜水...
    無鹽有點(diǎn)言閱讀 369評論 0 0
  • 親子日記第21天坞淮,共計201天.明天就是元旦了。所有的人都休息了吧陪捷,只有我們公司的員工還在上班。煩煩煩诺擅,星期...
    馨寶貝之快樂每一天閱讀 204評論 0 1