reflect

////////////////////////2016-11-18///////////////////////////

int study_data(){

reflect:

簡介:

反射是一種強(qiáng)大的工具寂诱。它使您能夠創(chuàng)建靈活的代碼郭蕉,這些代碼可以在運(yùn)行時(shí)裝配骇钦,無需在組件之間進(jìn)行源代表鏈接。它允許運(yùn)行中的 Java 程序?qū)ψ陨磉M(jìn)行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。

一般的RTTI(運(yùn)行時(shí)類型識別)形式包括三種:

1.傳統(tǒng)的類型轉(zhuǎn)換凌停。如“(Apple)Fruit”,由RTTI確保類型轉(zhuǎn)換的正確性售滤,如果執(zhí)行了一個(gè)錯(cuò)誤的類型轉(zhuǎn)換,就會(huì)拋出一個(gè)ClassCastException異常台诗。

2.通過Class對象來獲取對象的類型完箩。如

Class c = Class.forName(“Apple”);

Object o = c.newInstance();

3.通過關(guān)鍵字instanceof或Class.isInstance()方法來確定對象是否屬于某個(gè)特定類型的實(shí)例,準(zhǔn)確的說拉队,應(yīng)該是instanceof / Class.isInstance()可以用來確定對象是否屬于某個(gè)特定類及其所有基類的實(shí)例弊知,這和equals() / ==不一樣,它們用來比較兩個(gè)對象是否屬于同一個(gè)類的實(shí)例粱快,沒有考慮繼承關(guān)系秩彤。

如果類型在編譯時(shí)已知,可以通過RTTI來獲取事哭。即在編譯時(shí)漫雷,編譯器必須知道所有通過RTTI來處理的類。但如果使用反射機(jī)制鳍咱,可以不受這個(gè)限制降盹,它主要應(yīng)用于兩種情況:

第一種情況,是“基于構(gòu)件的編程”這種編程方式中谤辜,將使用某種基于快速應(yīng)用開發(fā)(RAD)的應(yīng)用構(gòu)建工具來構(gòu)建項(xiàng)目蓄坏。這是現(xiàn)在最常見的可視化編程方法,通過代表不同組件的圖標(biāo)拖動(dòng)到圖板上丑念,然后設(shè)置”構(gòu)件“(組件)的屬性值來配置它們來創(chuàng)建程序涡戳。

要做到這種配置編程,就必須要求構(gòu)件都是可實(shí)例化的脯倚,并且要暴露其部分信息渔彰,使得程序員可以讀取和設(shè)置構(gòu)件的值和狀態(tài)。當(dāng)處理GUI時(shí)間的構(gòu)件時(shí)還必須暴露相關(guān)方法的事件處理細(xì)節(jié)推正,以便RAD環(huán)境幫助程序員覆蓋這些處理事件的方法胳岂。在這里,就要用到反射的機(jī)制來檢查可用的方法并返回方法實(shí)體對象舔稀。Java通過JavaBeans提供了基于構(gòu)件的編程架構(gòu)乳丰。

第二種情況,在運(yùn)行時(shí)獲取類的信息的另外一個(gè)動(dòng)機(jī)内贮,就是希望能夠提供在跨網(wǎng)絡(luò)的遠(yuǎn)程平臺(tái)上創(chuàng)建和運(yùn)行對象的能力产园。這被成為遠(yuǎn)程調(diào)用(RMI)汞斧,它允許一個(gè)Java程序?qū)ο蠓植皆诙嗯_(tái)機(jī)器上,這種分步能力將幫助開發(fā)人員執(zhí)行一些需要進(jìn)行大量計(jì)算的任務(wù)什燕,充分利用計(jì)算機(jī)資源粘勒,提高運(yùn)行速度。

Class類支持反射屎即,是在java.lang.reflect中包含了Field/Method/Constructor類庙睡,每個(gè)類都實(shí)現(xiàn)了Member接口。這些類型的對象都是由JVM在運(yùn)行時(shí)創(chuàng)建的技俐,用來表示未知類里對應(yīng)的成員乘陪。如可以用Constructor類創(chuàng)建新的對象,用get()和set()方法讀取和修改與Field對象關(guān)聯(lián)的字段雕擂,用invoke()方法調(diào)用與Method對象關(guān)聯(lián)的方法啡邑。

同時(shí),還可以調(diào)用getFields()井赌、getMethods()谤逼、getConstructors()等方法來返回表示字段、方法以及構(gòu)造器的對象數(shù)組仇穗。這樣流部,未知的對象的類信息在運(yùn)行時(shí)就能被完全確定下來,而在編譯時(shí)不需要知道任何信息纹坐。

另外贵涵,RTTI有時(shí)能解決效率問題。當(dāng)程序中使用多態(tài)給程序的運(yùn)行帶來負(fù)擔(dān)的時(shí)候恰画,可以使用RTTI編寫一段代碼來提高效率宾茂。

reflect的作用:

了解類的各種信息

操作成員變量

調(diào)用成員方法

創(chuàng)建對象實(shí)例(instance)

reflect操作實(shí)例:

//獲取類名的3種方法

(1) ? ?className = d.getClass().getName());

(2) ? ?String className = "reflect.Dog";

? ? ? ? Class c = Class.forName(className);

? ? ? ? className = c.getName() ;

(3) ? ?Class cc = Dog.class;

? ? ? ? ?className = cc.getName());

?//獲取類方法

(1)Class dogClass = Dog.class;

? ? Method[] m1 = dogClass.getMethods(); //打印公共方法

? ? for(Method me:m1){

? ? ? ? System.out.println(me.getName());

? ? }

(2)Method[] m2 = dogClass.getDeclaredMethods(); //打印自己定義的所有方法

? ? for(Method me:m2){

? ? ? ? ?System.out.println(me.getName());

? ? }

//獲取類實(shí)現(xiàn)的所有接口

ClassdogClass = Dog.class;

for(Class i:dogClass.getInterfaces()){

? ? System.out.println(i.getName());

//獲取類的所有構(gòu)造函數(shù)

Constructor[] getConstructor = Class.forName(d.getClass().getName()).getConstructors();

for(Constructor c:getConstructor){

? ? System.out.println(c);

}

//獲取類的成員屬性

Field []field = d.getClass().getDeclaredFields();

for(Field f:field){

? ? System.out.println(f.getName());

}

//獲取類的父類

Class c = d.getClass().getSuperclass();

System.out.println(c.getName());

//2種創(chuàng)建對象的實(shí)例的方法

Class dogClass = Dog.class;

1:不帶參數(shù)的構(gòu)造函數(shù)

? ? ? ? ?Object o1 = dogClass.newInstance();

? ? ? ? ?System.out.println(o1);

2:帶參數(shù)的構(gòu)造函數(shù)

? ? ? ? ?Constructor c = dogClass.getConstructor(new Class []{String.class});

? ? ? ? ?Dog o2 = (Dog)c.newInstance(new Object []{"xiaohuang"});

? ? ? ? ?System.out.println(o2.name);

//操作成員變量

ClassdogClass = Dog.class;

Field[] fields = dogClass.getDeclaredFields();

for(Field f:fields){ ? ? //遍歷打印所有成員變量

? ? System.out.println(f.getName());

}

//操作公有變量

Field f = dogClass.getField("name"); ??

f.set(o, "erhei"); ? //將對象o的name屬性值改為erhei

//操作私有變量

Field f2 = dogClass.getDeclaredField("owner");

f2.setAccessible(true); ? //獲取成員變量owner的訪問權(quán)限

f2.set(o, "john");

//調(diào)用成員方法

ClassdogClass = Dog.class;

Object o = dogClass.newInstance();

Method m = dogClass.getMethod("run", new Class[]{});

m.invoke(o, new Object[]{});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拴还,隨后出現(xiàn)的幾起案子跨晴,更是在濱河造成了極大的恐慌,老刑警劉巖片林,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端盆,死亡現(xiàn)場離奇詭異,居然都是意外死亡费封,警方通過查閱死者的電腦和手機(jī)焕妙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弓摘,“玉大人焚鹊,你說我怎么就攤上這事∪拖祝” “怎么了末患?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵研叫,是天一觀的道長。 經(jīng)常有香客問我璧针,道長嚷炉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任探橱,我火速辦了婚禮申屹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隧膏。我一直安慰自己哗讥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布私植。 她就那樣靜靜地躺著,像睡著了一般车酣。 火紅的嫁衣襯著肌膚如雪曲稼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天湖员,我揣著相機(jī)與錄音贫悄,去河邊找鬼。 笑死娘摔,一個(gè)胖子當(dāng)著我的面吹牛窄坦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凳寺,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼鸭津,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肠缨?” 一聲冷哼從身側(cè)響起逆趋,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晒奕,沒想到半個(gè)月后闻书,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脑慧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年魄眉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷袒。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑律,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出囊骤,到底是詐尸還是另有隱情脾歇,我是刑警寧澤蒋腮,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站藕各,受9級特大地震影響池摧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜激况,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一作彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乌逐,春花似錦竭讳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洛波,卻和暖如春胰舆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬挤。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工缚窿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焰扳。 一個(gè)月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓倦零,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吨悍。 傳聞我的和親對象是個(gè)殘疾皇子扫茅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

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

  • Java Reflect 反射機(jī)制 類字節(jié)碼文件是在硬盤上存儲(chǔ)的,是一個(gè)個(gè)的.class文件育瓜。我們在new一個(gè)對象...
    灰氣球閱讀 1,180評論 0 0
  • 1. Java中的多態(tài)性理解(注意與C++區(qū)分) Java中除了static方法和final方法(private方...
    小敏紙閱讀 1,438評論 0 19
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法诞帐,類相關(guān)的語法,內(nèi)部類的語法爆雹,繼承相關(guān)的語法停蕉,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 多態(tài) 任何域的訪問操作都將有編譯器解析钙态,如果某個(gè)方法是靜態(tài)的慧起,它的行為就不具有多態(tài)性 java默認(rèn)對象的銷毀順序與...
    yueyue_projects閱讀 936評論 0 1
  • 我不知道為什么來到商店里就想買點(diǎn)零食吃蚓挤,我明明知道我吃完后會(huì)難受,可是還是想買來吃,去填補(bǔ)我內(nèi)心那種失空灿意,就想知...
    未央行者閱讀 181評論 0 0