java基礎(chǔ)07反射技術(shù)

七、反射技術(shù)

反射技術(shù):其實就是動態(tài)加載一個指定的類限书,并獲取該類中的所有的內(nèi)容罩扇。并將字節(jié)碼文件中的內(nèi)容都封裝成對象,這樣便于操作這些成員狱掂。簡單說:反射技術(shù)可以對一個類進(jìn)行解剖。

反射的好處:大大的增強了程序的擴展性亲轨。

反射的基本步驟:
1趋惨、獲得Class對象,就是獲取到指定的名稱的字節(jié)碼文件對象惦蚊。
2器虾、實例化對象,獲得類的屬性养筒、方法或構(gòu)造函數(shù)曾撤。
3、訪問屬性晕粪、調(diào)用方法挤悉、調(diào)用構(gòu)造函數(shù)創(chuàng)建對象。

獲取這個Class對象巫湘,有三種方式:

1:通過每個對象都具備的方法getClass來獲取装悲。弊端:必須要創(chuàng)建該類對象,才可以調(diào)用getClass方法尚氛。

2:每一個數(shù)據(jù)類型(基本數(shù)據(jù)類型和引用數(shù)據(jù)類型)都有一個靜態(tài)的屬性class诀诊。弊端:必須要先明確該類。

前兩種方式不利于程序的擴展阅嘶,因為都需要在程序使用具體的類來完成属瓣。

3:使用的Class類中的方法,靜態(tài)的forName方法讯柔。

指定什么類名抡蛙,就獲取什么類字節(jié)碼文件對象,這種方式的擴展性最強魂迄,只要將類名的字符串傳入即可粗截。

// 1. 根據(jù)給定的類名來獲得 用于類加載

String classname = "cn.itcast.reflect.Person";// 來自配置文件

Class clazz = Class.forName(classname);// 此對象代表Person.class

// 2. 如果拿到了對象,不知道是什么類型 用于獲得對象的類型

Object obj = new Person();

Class clazz1 = obj.getClass();// 獲得對象具體的類型

// 3. 如果是明確地獲得某個類的Class對象 主要用于傳參

Class clazz2 = Person.class;    

反射的用法:

1)捣炬、需要獲得java類的各個組成部分熊昌,首先需要獲得類的Class對象绽榛,獲得Class對象的三種方式:

Class.forName(classname)    用于做類加載

obj.getClass()           用于獲得對象的類型

類名.class             用于獲得指定的類型,傳參用

2)婿屹、反射類的成員方法:

Class clazz = Person.class;

Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});

method.invoke();

3)灭美、反射類的構(gòu)造函數(shù):

Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})

con.newInstance(params...)

4)、反射類的屬性:

Field field = clazz.getField(fieldName);

field.setAccessible(true);

field.setObject(value);

獲取了字節(jié)碼文件對象后选泻,最終都需要創(chuàng)建指定類的對象:

創(chuàng)建對象的兩種方式(其實就是對象在進(jìn)行實例化時的初始化方式):

1冲粤,調(diào)用空參數(shù)的構(gòu)造函數(shù):使用了Class類中的newInstance()方法。

2页眯,調(diào)用帶參數(shù)的構(gòu)造函數(shù):先要獲取指定參數(shù)列表的構(gòu)造函數(shù)對象梯捕,然后通過該構(gòu)造函數(shù)的對象的newInstance(實際參數(shù)) 進(jìn)行對象的初始化。

綜上所述窝撵,第二種方式傀顾,必須要先明確具體的構(gòu)造函數(shù)的參數(shù)類型,不便于擴展碌奉。所以一般情況下短曾,被反射的類,內(nèi)部通常都會提供一個公有的空參數(shù)的構(gòu)造函數(shù)赐劣。


// 如何生成獲取到字節(jié)碼文件對象的實例對象嫉拐。

    Class clazz = Class.forName("cn.itcast.bean.Person");//類加載

// 直接獲得指定的類型

    clazz = Person.class;

    // 根據(jù)對象獲得類型

    Object obj = new Person("zhangsan", 19);

    clazz = obj.getClass();

    Object obj = clazz.newInstance();//該實例化對象的方法調(diào)用就是指定類中的空參數(shù)構(gòu)造函數(shù),給創(chuàng)建對象進(jìn)行初始化魁兼。當(dāng)指定類中沒有空參數(shù)構(gòu)造函數(shù)時婉徘,該如何創(chuàng)建該類對象呢?請看method_2();

public static void method_2() throws Exception {

    Class clazz = Class.forName("cn.itcast.bean.Person");

    //既然類中沒有空參數(shù)的構(gòu)造函數(shù),那么只有獲取指定參數(shù)的構(gòu)造函數(shù),用該函數(shù)來進(jìn)行實例化咐汞。

    //獲取一個帶參數(shù)的構(gòu)造器盖呼。

    Constructor constructor = clazz.getConstructor(String.class,int.class);

    //想要對對象進(jìn)行初始化,使用構(gòu)造器的方法newInstance();

    Object obj = constructor.newInstance("zhagnsan",30);

    //獲取所有構(gòu)造器化撕。

    Constructor[] constructors = clazz.getConstructors();//只包含公共的

    constructors = clazz.getDeclaredConstructors();//包含私有的

    for(Constructor con : constructors) {

        System.out.println(con);

    }

}

反射指定類中的方法:

//獲取類中所有的方法几晤。

public static void method_1() throws Exception {

    Class clazz = Class.forName("cn.itcast.bean.Person");

    Method[] methods = clazz.getMethods();//獲取的是該類中的公有方法和父類中的公有方法。

    methods = clazz.getDeclaredMethods();//獲取本類中的方法植阴,包含私有方法蟹瘾。

    for(Method method : methods) {

        System.out.println(method);

    }

}

//獲取指定方法;

public static void method_2() throws Exception {

    Class clazz = Class.forName("cn.itcast.bean.Person");

    //獲取指定名稱的方法掠手。

    Method method = clazz.getMethod("show", int.class,String.class);

    //想要運行指定方法热芹,當(dāng)然是方法對象最清楚,為了讓方法運行惨撇,調(diào)用方法對象的invoke方法即可,但是方法運行必須要明確所屬的對象和具體的實際參數(shù)府寒。

    Object obj = clazz.newInstance();

    method.invoke(obj, 39,"hehehe");//執(zhí)行一個方法

}

//想要運行私有方法魁衙。

public static void method_3() throws Exception {

    Class clazz = Class.forName("cn.itcast.bean.Person");

    //想要獲取私有方法报腔。必須用getDeclearMethod();

    Method method = clazz.getDeclaredMethod("method", null);

    // 私有方法不能直接訪問,因為權(quán)限不夠剖淀。非要訪問纯蛾,可以通過暴力的方式。

    method.setAccessible(true);//一般很少用纵隔,因為私有就是隱藏起來翻诉,所以盡量不要訪問。

}

//反射靜態(tài)方法捌刮。

public static void method_4() throws Exception {

    Class clazz = Class.forName("cn.itcast.bean.Person");

    Method method = clazz.getMethod("function",null);

    method.invoke(null,null);

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碰煌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绅作,更是在濱河造成了極大的恐慌芦圾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俄认,死亡現(xiàn)場離奇詭異个少,居然都是意外死亡,警方通過查閱死者的電腦和手機眯杏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門夜焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岂贩,你說我怎么就攤上這事茫经。” “怎么了河闰?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵科平,是天一觀的道長。 經(jīng)常有香客問我姜性,道長瞪慧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任部念,我火速辦了婚禮弃酌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘儡炼。我一直安慰自己妓湘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布乌询。 她就那樣靜靜地躺著榜贴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妹田。 梳的紋絲不亂的頭發(fā)上唬党,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天鹃共,我揣著相機與錄音,去河邊找鬼驶拱。 笑死霜浴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓝纲。 我是一名探鬼主播阴孟,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼税迷!你這毒婦竟也來了永丝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤翁狐,失蹤者是張志新(化名)和其女友劉穎类溢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體露懒,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡闯冷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了懈词。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇耀。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坎弯,靈堂內(nèi)的尸體忽然破棺而出纺涤,到底是詐尸還是另有隱情,我是刑警寧澤抠忘,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布撩炊,位于F島的核電站,受9級特大地震影響崎脉,放射性物質(zhì)發(fā)生泄漏拧咳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一囚灼、第九天 我趴在偏房一處隱蔽的房頂上張望骆膝。 院中可真熱鬧,春花似錦灶体、人聲如沸阅签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽政钟。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間养交,已是汗流浹背衷戈。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留层坠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓刁笙,卻偏偏與公主長得像破花,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疲吸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 整理來自互聯(lián)網(wǎng) 1座每,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境摘悴,java的開發(fā)工具...
    Ncompass閱讀 1,534評論 0 6
  • 一:java概述: 1峭梳,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境蹂喻,java的開發(fā)...
    慕容小偉閱讀 1,766評論 0 10
  • 豎直肌 位于下背部保護(hù)神經(jīng)通道葱椭。幫助脊椎保持豎直,他還是高強度訓(xùn)練后恢復(fù)的最慢的肌肉口四。 上背部練習(xí)方法 主要是聳肩...
  • 全目錄 | 《待我長發(fā)及腰來娶你》 **文 | **她在非洲漂 認(rèn)識唐臻時孵运,是2000年, 千禧年蔓彩, 我十歲治笨。 ...
    她在非洲漂閱讀 766評論 21 32
  • ·每天,當(dāng)我走在路上赤嚼,站在人群中旷赖,總會不自覺地觀察那無數(shù)個穿梭在自己身邊、神態(tài)各異的面孔幻想他們此刻的心情更卒。經(jīng)過怎...
    wu楓閱讀 146評論 0 0