Java反射使用總結(jié)

Java反射總結(jié)

1.反射機(jī)制的定義

1.1定義

Java反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類帐我,都能夠知道這個(gè)類中的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性扒袖;這種動(dòng)態(tài)(運(yùn)行時(shí))獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。

1.2特點(diǎn)
  • 優(yōu)點(diǎn):靈活性高亩码。因?yàn)榉瓷鋵儆趧?dòng)態(tài)編譯季率,即只有到運(yùn)行時(shí)才動(dòng)態(tài)創(chuàng)建 &獲取對(duì)象實(shí) 例
  • 缺點(diǎn):效率低,反射執(zhí)行所需要的時(shí)間長(zhǎng)描沟。

2.反射的應(yīng)用場(chǎng)景

  1. 逆向代碼 飒泻,例如反編譯

  2. 與注解相結(jié)合的框架 例如Retrofit

  3. 單純的反射機(jī)制應(yīng)用框架 例如EventBus

  4. 動(dòng)態(tài)生成類框架 例如Gson
    常用的動(dòng)態(tài)代理,工廠模式優(yōu)化吏廉,與注解結(jié)合使用都是值得我們學(xué)習(xí)的泞遗。

3.Java反射的功能

  1. 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類。

2.在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象席覆。

3.在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法史辙。

4.在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法。

5.生成動(dòng)態(tài)代理。

4.具體使用步驟

  1. 獲取 目標(biāo)類型的Class對(duì)象
  2. 通過(guò) Class 對(duì)象分別獲取Constructor類對(duì)象聊倔、Method類對(duì)象 & Field 類對(duì)象
  3. 通過(guò) Constructor類對(duì)象晦毙、Method類對(duì)象 & Field類對(duì)象分別獲取類的構(gòu)造函數(shù)、方法&屬性的具體信息耙蔑。
  4. . 通過(guò)Class對(duì)象創(chuàng)建類的對(duì)象
  5. 對(duì)新創(chuàng)建的對(duì)象屬性賦值见妒,調(diào)用相關(guān)方法。

4.1獲得Class對(duì)象

每個(gè)類被加載之后甸陌,系統(tǒng)就會(huì)為該類生成一個(gè)對(duì)應(yīng)的Class對(duì)象须揣。通過(guò)該Class對(duì)象就可以訪問(wèn)到JVM中的這個(gè)類。

在Java程序中獲得Class對(duì)象通常有如下三種方式:

  1. 使用Class類的forName(String clazzName)靜態(tài)方法钱豁。該方法需要傳入字符串參數(shù)返敬,該字符串參數(shù)的值是某個(gè)類的全限定名(必須添加完整包名)。

  2. 調(diào)用某個(gè)類的class屬性來(lái)獲取該類對(duì)應(yīng)的Class對(duì)象寥院。

  3. 調(diào)用某個(gè)對(duì)象的getClass()方法劲赠。該方法是java.lang.Object類中的一個(gè)方法。

//第一種方式 通過(guò)Class類的靜態(tài)方法——forName()來(lái)實(shí)現(xiàn)
class1 = Class.forName("com.demo.Person");
//第二種方式 通過(guò)類的class屬性
class1 = Person.class;
//第三種方式 通過(guò)對(duì)象getClass方法
Person person = new Person();
Class<?> class1 = person.getClass();

4.2獲取class對(duì)象的屬性秸谢、方法凛澎、構(gòu)造函數(shù)等

  1. 獲取class對(duì)象的成員變量
Field[] allFields = class1.getDeclaredFields();//獲取class對(duì)象的所有屬性
Field[] publicFields = class1.getFields();//獲取class對(duì)象的public屬性
Field ageField = class1.getDeclaredField("age");//獲取class指定屬性
Field desField = class1.getField("des");//獲取class指定的public屬性System.out.println(ageField);
// 輸出結(jié)果
private int com.demo.Person.age
  1. 獲取class對(duì)象的方法
Method[] methods = class1.getDeclaredMethods();//獲取class對(duì)象的所有聲明方法
Method[] allMethods = class1.getMethods();//獲取class對(duì)象的所有public方法 包括父類的方法
Method method = class1.getMethod("print", String.class);//返回次Class對(duì)象對(duì)應(yīng)類的、帶指定形參列表的public方法
Method declaredMethod = class1.getDeclaredMethod("print", String.class);//返回次Class對(duì)象對(duì)應(yīng)類的估蹄、帶指定形參列表的方法
// 輸出結(jié)果
public void com.demo.Person.print()
  1. 獲取class對(duì)象的構(gòu)造函數(shù)
Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//獲取class對(duì)象的所有聲明構(gòu)造函數(shù)
Constructor<?>[] publicConstructors = class1.getConstructors();//獲取class對(duì)象public構(gòu)造函數(shù)
Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//獲取指定聲明構(gòu)造函數(shù)
Constructor publicConstructor = class1.getConstructor(String.class);//獲取指定聲明的public構(gòu)造函數(shù)

4.訪問(wèn)權(quán)限問(wèn)題
反射機(jī)制的默認(rèn)行為受限于Java的訪問(wèn)控制,設(shè)置setAccessible

void setAccessible(boolean flag)    
// 作用:為反射對(duì)象設(shè)置可訪問(wèn)標(biāo)志
// 規(guī)則:flag = true時(shí) 塑煎,表示已屏蔽Java語(yǔ)言的訪問(wèn)檢查,使得可以訪問(wèn) & 修改對(duì)象的私有屬性

boolean isAccessible()  
// 返回反射對(duì)象的可訪問(wèn)標(biāo)志的值

static void setAccessible(AccessibleObject[] array, boolean flag)   
// 設(shè)置對(duì)象數(shù)組可訪問(wèn)標(biāo)志

5.實(shí)例
1.定義Person類

public class Person implements Cloneable, Serializable {
    private int age;
    private String name;
    public  int number;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
  
    public void print(){
        System.out.println("Person類");
    }
 }

2.反射獲取對(duì)象的屬性臭蚁,方法

 Class personClass1 = Person.class;
 Field ageField = personClass1.getDeclaredField("age");//獲取class指定屬性
 System.out.println(ageField);
 Person person = (Person) personClass1.newInstance();
 ageField.setAccessible(true);
 ageField.set(person,2);
 System.out.println(person.age);
//輸出結(jié)果
0
2
Method method = personClass1.getMethod("print");
method.setAccessible(true);

method.invoke(person);

6.總結(jié)

下面的流程圖為反射使用的流程最铁。本文只介紹的Java中的反射,后續(xù)將介紹注解垮兑,以后注解和反射在很多框架里面的使用冷尉。


反射使用流程.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市系枪,隨后出現(xiàn)的幾起案子雀哨,更是在濱河造成了極大的恐慌,老刑警劉巖私爷,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雾棺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衬浑,警方通過(guò)查閱死者的電腦和手機(jī)捌浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)工秩,“玉大人尸饺,你說(shuō)我怎么就攤上這事宏榕。” “怎么了侵佃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵麻昼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我馋辈,道長(zhǎng)抚芦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任迈螟,我火速辦了婚禮叉抡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘答毫。我一直安慰自己褥民,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布洗搂。 她就那樣靜靜地躺著消返,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耘拇。 梳的紋絲不亂的頭發(fā)上撵颊,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音惫叛,去河邊找鬼倡勇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘉涌,可吹牛的內(nèi)容都是我干的妻熊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仑最,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扔役!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起词身,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厅目,失蹤者是張志新(化名)和其女友劉穎番枚,沒(méi)想到半個(gè)月后法严,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葫笼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年深啤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片路星。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溯街,死狀恐怖诱桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呈昔,我是刑警寧澤挥等,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站堤尾,受9級(jí)特大地震影響肝劲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郭宝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一辞槐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粘室,春花似錦榄檬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锦爵,卻和暖如春犬缨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棉浸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工怀薛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迷郑。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓枝恋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗡害。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焚碌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 反射機(jī)制是什么 反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類霸妹,都能夠知道這個(gè)類的所有屬性和方法十电;對(duì)于任意一個(gè)對(duì)象,都能夠...
    marjorie葉子閱讀 317評(píng)論 0 1
  • 一:java概述:1叹螟,JDK:Java Development Kit鹃骂,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,661評(píng)論 0 11
  • 反射機(jī)制是什么 反射機(jī)制是在運(yùn)行狀態(tài)中罢绽,對(duì)于任意一個(gè)類畏线,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象良价,都能夠...
    java部落閱讀 156評(píng)論 0 0
  • 聲明:原創(chuàng)文章寝殴,轉(zhuǎn)載請(qǐng)注明出處蒿叠。http://www.reibang.com/p/b4757a970b26 一、概...
    唐影若凡閱讀 227評(píng)論 0 1
  • 整理來(lái)自互聯(lián)網(wǎng) 1蚣常,JDK:Java Development Kit市咽,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工具...
    Ncompass閱讀 1,540評(píng)論 0 6