Java反射機(jī)制Review

最近想對(duì)Retrofit做一次源碼分析瞳腌,里面涉及到很多諸如反射和動(dòng)態(tài)代理等一些Java特性,先回顧一下

  1. 反射機(jī)制概述
  2. Class對(duì)象的機(jī)制與實(shí)現(xiàn)
  3. Field對(duì)象的機(jī)制與實(shí)現(xiàn)
  4. Method對(duì)象的機(jī)制與實(shí)現(xiàn)

反射機(jī)制背景概述

Reflection是java被視為動(dòng)態(tài)或準(zhǔn)動(dòng)態(tài)語(yǔ)言的一個(gè)關(guān)鍵性質(zhì),反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取人和類(lèi)的內(nèi)部所有信息

  • 反射機(jī)制實(shí)現(xiàn)功能概述
  1. 只要給定類(lèi)的全名,即刻通過(guò)反射獲取類(lèi)的所有信息
  2. 反射可以在程序運(yùn)行時(shí)獲取任意一個(gè)對(duì)象所屬的類(lèi)對(duì)象
  3. 在運(yùn)行時(shí)可以獲取到類(lèi)中所有屬性對(duì)象,并對(duì)其操作鞭光,包括私有屬性
  4. 在運(yùn)行時(shí)可以獲取到類(lèi)中,弗雷中所有方法泞遗,并調(diào)用
  5. 目前主流的應(yīng)用框架如Struts2惰许,Hibernate,Spring史辙,SpringMVC等框架的核心都是利用java的反射機(jī)制來(lái)實(shí)現(xiàn)的

Class對(duì)象的機(jī)制與實(shí)現(xiàn)

class其實(shí)就是類(lèi)的類(lèi)型,字符串類(lèi)型是String汹买,整形類(lèi)型就是Integer佩伤,String和Integer類(lèi)型就是Class

getName() 獲取類(lèi)中完整名稱(chēng)
getDeclaredFields()取類(lèi)中所有屬性
getDeclaredmethods() 獲取類(lèi)中所有的方法
getConstructor() 獲取類(lèi)構(gòu)造方法
getInstance()實(shí)例化對(duì)象

class對(duì)象操作

public class ClazzTest {
public static void main(String[] args){
    Class demo1= null;
    Class demo2= null;
    Class demo3= null;
    //第一種方式
    try {
        demo1 =Class.forName("com.gunther.reflection.main.Book");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    System.out.println("第一種:"+demo1);
    //第二種
    Book book = new Book();
    Object ob = book;
    System.out.println("第二種:"+ob.getClass());
    //第三種
    demo3=Book.class;
    System.out.println("第三種:"+demo3);
    try {
        Book book1 = (Book) demo3.newInstance();
        System.out.println("實(shí)例化后的類(lèi)對(duì)象:"+book1);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

}
}

public class Book {
private int id;
private String name;
private String type;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}
}

Field對(duì)象的機(jī)制與實(shí)現(xiàn)

java.lang.reflect.Field類(lèi),是勇于標(biāo)識(shí)類(lèi)中卦睹,接口中屬性對(duì)象的類(lèi),可以操作類(lèi)中私有畦戒,以及共有等全部屬性和屬性的信息

Field對(duì)象的常用方法介紹

  1. getName() 獲取屬性名稱(chēng)
  2. getType()獲取屬性類(lèi)型
  3. get(Object obj)獲取obj對(duì)象中這個(gè)屬性的值
  4. set(Object obj,Object value)向obj對(duì)象中這個(gè)屬性賦值value
  5. setAccessible(true) 啟用/禁止訪問(wèn)控制權(quán)限

field對(duì)象操作

public class FieldTest {
public static void main(String[] args) {
    Book book = new Book();
    book.setId(1);
    book.setName("無(wú)線(xiàn)智能水壓表");
    book.setType("消火栓");
    FieldTest fieldTest = new FieldTest();
    fieldTest.show(Book.class);
}

//該方法用于使用傳遞過(guò)來(lái)的Class對(duì)象獲取類(lèi)中的屬性
public void show(Class clazz) {
    Field[] fi = clazz.getDeclaredFields();
    //可以將私有屬性也獲取,getField智能獲取公有屬性
    for (Field ff : fi) {
        System.out.println(ff.getName());
        System.out.println(ff.getType());
    }
}

//該方法勇于使用傳遞過(guò)來(lái)的實(shí)體類(lèi)對(duì)象结序,獲取屬性以及屬性的值
public void show(Object ob) {
    Class clazz = ob.getClass();
    Field[] fi = clazz.getDeclaredFields();
    try {
        for (Field ff : fi) {
            ff.setAccessible(true);//設(shè)置啟用
            System.out.println(ff.getName() + "值" + ff.get(ob));
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

}
}

Method對(duì)象的機(jī)制與實(shí)現(xiàn)

java.lang.relect.Method類(lèi)是勇于標(biāo)識(shí)類(lèi)中障斋,接口中方法對(duì)象的類(lèi),可以操作類(lèi)中私有,以及共有等全部方法

Method對(duì)象常用方法介紹
getName 獲取方法名稱(chēng)
getReturnType 獲取方法返回值類(lèi)型
invoke(Object obj,Object...args)利用obj對(duì)象調(diào)用該方法
getParameterTypes() 獲取方法所有參數(shù)類(lèi)型徐鹤,按照順序返回Class數(shù)組
getDeclaredAnnotations()獲取方法的全部注解

method對(duì)象操作

public class MethodTest {
public static void main(String[] args) {
    Book book = new Book();
    book.setId(1);
    book.setName("無(wú)線(xiàn)智能水壓表");
    book.setType("消火栓");
    MethodTest methodTest = new MethodTest();
    methodTest.show(book);
    methodTest.showUse(book);
    System.out.println(book.getName());
}

//該方法用于獲取對(duì)象所有方法名稱(chēng)垃环,返回值類(lèi)型,以及參數(shù)信息
public void show(Object ob) {
    Class<?> clazz = ob.getClass();
    Method[] me = clazz.getDeclaredMethods();
    for (Method mm : me) {
        System.out.println("方法名稱(chēng):" + mm.getName());
        System.out.println("方法修飾符:" + mm.getModifiers());
        System.out.println("方法返回值類(lèi)型:" + mm.getReturnType());
        Class[] preType = mm.getParameterTypes();
        System.out.println("方法參數(shù)列表:");
        for (Class cl : preType) {
            System.out.println(cl.getName());
        }
    }
}

//該方法用于獲取對(duì)象,獲取其中方法并調(diào)用
public void showUse(Object ob) {
    Class<?> clazz = ob.getClass();
    try {
        Method me = clazz.getMethod("getName", null);
        me.invoke(ob,new Object[0]);

        Method me1 = clazz.getMethod("setName", String.class);
        me.invoke(ob,"test");
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末返敬,一起剝皮案震驚了整個(gè)濱河市遂庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劲赠,老刑警劉巖涛目,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凛澎,居然都是意外死亡霹肝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)塑煎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沫换,“玉大人,你說(shuō)我怎么就攤上這事最铁⊙渡停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冷尉,是天一觀的道長(zhǎng)漱挎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)雀哨,這世上最難降的妖魔是什么识樱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮震束,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘当犯。我一直安慰自己垢村,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布嚎卫。 她就那樣靜靜地躺著嘉栓,像睡著了一般宏榕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侵佃,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天麻昼,我揣著相機(jī)與錄音,去河邊找鬼馋辈。 笑死抚芦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的迈螟。 我是一名探鬼主播叉抡,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼答毫!你這毒婦竟也來(lái)了褥民?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤洗搂,失蹤者是張志新(化名)和其女友劉穎消返,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耘拇,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撵颊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驼鞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦驯。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挣棕,靈堂內(nèi)的尸體忽然破棺而出译隘,到底是詐尸還是另有隱情,我是刑警寧澤洛心,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布固耘,位于F島的核電站,受9級(jí)特大地震影響词身,放射性物質(zhì)發(fā)生泄漏厅目。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一法严、第九天 我趴在偏房一處隱蔽的房頂上張望损敷。 院中可真熱鬧,春花似錦深啤、人聲如沸拗馒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诱桂。三九已至洋丐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挥等,已是汗流浹背友绝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肝劲,地道東北人迁客。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涡相,于是被迫代替她去往敵國(guó)和親哲泊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 一催蝗、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中切威,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)中的所有屬性和方法...
    CoderZS閱讀 1,634評(píng)論 0 26
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理丙号,服務(wù)發(fā)現(xiàn)先朦,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 一犬缨、概述 1喳魏、Java反射機(jī)制(Java-Reflect): 在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi)怀薛,都能夠知道這個(gè)類(lèi)中的所...
    年少懵懂丶流年夢(mèng)閱讀 4,406評(píng)論 0 5
  • 一:java概述:1刺彩,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境枝恋,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,649評(píng)論 0 11
  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類(lèi)的函數(shù)创倔、...
    Ten_Minutes閱讀 536評(píng)論 0 4