反射

java中反射是通過一定的條件得到類對(duì)象然后進(jìn)行各種操作的過程;

反射有可以分為幾個(gè)層次弧满;

1 得到類對(duì)象

2. 得到構(gòu)造方法

3. 得到屬性

4. 得到方法

## 反射(重要)

? ? 重要的關(guān)鍵字的關(guān)鍵字

? ? ? ? Class? ? ? ? ? ? ? //獲得類對(duì)象,大前提

? ? ? ? ? ? Constructor? ? //獲得類中的構(gòu)造方法阀坏,二前提

? ? ? ? ? ? ? ? Method? ? //獲得類中的方法

? ? ? ? ? ? ? ? ? ? invoke? //對(duì)獲得到的方法傳參

? ? ? ? ? ? ? ? Filed? ? ? //獲得類中的變量

? ? ? ? ? ? ? ? ? ? set? ? //對(duì)獲得到的變量進(jìn)行設(shè)置

? ? 1. 獲得類對(duì)象? (關(guān)鍵字Class)?

? ? ? ? 三種方法


? ? ? ? 1)通過包名獲取

? ? ? ? ? ? Class cls1 = Class.forName("com.reflect.Person");? //括號(hào)里面是包名蹋订,具體到類橄教,Person是一個(gè)類名


? ? ? ? 2)通過類名獲取

? ? ? ? ? ? Class cls2 = Person.Class;


? ? ? ? 3) 通過一個(gè)構(gòu)造方法獲取

? ? ? ? ? ? Class cls3 = new Person(1, "小美").getClass();? ? ? //Person(1, "小美")? 是Person類的一個(gè)有參的構(gòu)造方法


? ? 2. 獲得構(gòu)造方法(關(guān)鍵字 Constructor)


? ? ? ? 先找到類對(duì)象:

? ? ? ? ? ? Class cls = Class.forName("com.reflect.Person");


? ? ? ? //獲得多個(gè)構(gòu)造方法

? ? ? ? 1)? 獲取所有非私有化的構(gòu)造方法

? ? ? ? ? ? Constructor[] constructors = cls.getConstructors();


? ? ? ? 2) 獲得所有構(gòu)造方法(包括私有和非私有)

? ? ? ? ? ? Constructor allConstructs = cls.getDeclaredConstructors();


? ? ? ? //獲得指定構(gòu)造方法,非私有

? ? ? ? 3) Constructor aConstructor = cls.getConstructor(int.class, String,class);? //括號(hào)里邊是獲得構(gòu)造方法需傳入的參數(shù)類型

? ? ? ? ? ? (1)利用獲得到的構(gòu)造方法創(chuàng)造一個(gè)新的對(duì)象

? ? ? ? ? ? ? ? Person p = (Person) aConstructor.newInstance(1, "妹子");

? ? ? ? ? ? ? ? ? ? p.sleep();

? ? ? ? ? ? ? ? ? ? p.game();


? ? ? ? 獲得私有化的構(gòu)造方法

? ? ? ? 4) Constructor privateConstructor = cls.getDeclaredConstructor(null);? ? //這是一個(gè)無參的構(gòu)造方法

? ? ? ? ? ? (1) 用得到的構(gòu)造方法創(chuàng)造對(duì)象浩村,需要授權(quán)

? ? ? ? ? ? ? ? privateConstructor.setAccessible(true);

? ? ? ? ? ? ? ? Person p2 = (Person) privateConstructor.newInstance(null);

? ? ? ? ? ? ? ? p2.setId(3);

? ? ? ? ? ? ? ? p2.setName("小媚");


? ? 3. 獲得成員方法(關(guān)鍵字 Method)

? ? ? ? 首先創(chuàng)建類對(duì)象

? ? ? ? ? ? Class cls = Class.forName("com.reflect.Person");


? ? ? ? 獲得所有方法:


? ? ? ? 1) 獲得所有方法(非私有,同時(shí)會(huì)獲取到父類的方法)

? ? ? ? ? ? Method[] allMethod = cls.getMethods();


? ? ? ? 2) 暴力方式獲得所有方法(包括私有和非私有做葵,會(huì)過濾掉父類的方法)

? ? ? ? ? ? Method[] allMethods = cls.getDeclareMethods();


? ? ? ? 獲得指定方法:

? ? ? ? ? ? Person aPerson = (Person) cls.getConstructor(int.class, String.class).newInstance(1, "小花");


? ? ? ? 3) 獲取一個(gè)指定的普通公共方法:

? ? ? ? ? ? Method aMethod = cls.getMethod("test", int.class);? ? ? ? ? //? "test" 是指定方法的方法名, int.class 是使用方法需傳入?yún)?shù)的類型

? ? ? ? ? ? aMethod.invoke(aPerson, 6);? ? ? ? ? ? ? ? //對(duì)參數(shù)進(jìn)行設(shè)置


? ? ? ? 4) 獲取一個(gè)靜態(tài)的方法

? ? ? ? ? ? Method aStaticMethod = cls.getMethod("ear", null);? ? ? ? ? //? null代表此方法不需要傳入任何參數(shù)

? ? ? ? ? ? aStaticMethod.invoke(null, null);? ? ? ? ? ? ? ? ? ? ? // 因?yàn)闆]有任何參數(shù)心墅,所有不需要設(shè)置值


? ? ? ? 5) 用暴力方法獲取一個(gè)私有化方法

? ? ? ? ? ? Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);? ? ? ? //私有化不需要傳入?yún)?shù)所以是null

? ? ? ? ? ? aPrivateMethod.getAccessible(true);? ? ? ? ? ? ? ? ? ? //給方法授權(quán)

? ? ? ? ? ? aPrivateMethod.invoke(aPerson, null);? ? ? ? ? ? ? //給私有化設(shè)置值


? ? 4. 獲得成員變量

? ? ? ? 首先創(chuàng)建類對(duì)象

? ? ? ? ? ? Class cls = Class.forName("com.reflect.Person");


? ? ? ? 獲得所有變量:

? ? ? ? 1) 獲得所有變量(非私有)

? ? ? ? ? ? Field[] aField = cls.getFields();


? ? ? ? 2) 暴力方法酿矢,獲得所有變量(包括私有和非私有)

? ? ? ? ? ? File[] aFileds = cls.getDeclaredFields();


? ? ? ? 3) 獲得指定變量(非私有)

? ? ? ? ? ? Field aPublicField = cls.getField("test");? ? ? ? ? //括號(hào)內(nèi)是指定變量的變量名


? ? ? ? ? ? aPublicField.set(aPerson, 5);? ? ? ? ? ? ? ? ? //對(duì)獲得到的變量賦值

? ? ? ? ? ? System.out.println(aPerson.test);? ? ? ? ? ? ? //變量的使用方法


? ? ? ? 4) 暴力方法,獲得私有化變量

? ? ? ? ? ? Field aPrivateField = cls.getDeclaredfField("id");? ? ?

? ? ? ? ? ? aPrivateField.setAccessible(true);? ? ? ? ? //對(duì)變量重新賦值之前需要對(duì)變量授權(quán)

? ? ? ? ? ? aPrivateField.set(aPerson, 8);? ? ? ? ? ? ? //對(duì)變量賦值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怎燥,一起剝皮案震驚了整個(gè)濱河市瘫筐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刺覆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件史煎,死亡現(xiàn)場(chǎng)離奇詭異谦屑,居然都是意外死亡驳糯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門氢橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酝枢,“玉大人,你說我怎么就攤上這事。” “怎么了翼岁?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵乡数,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我寇窑,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任古胆,我火速辦了婚禮,結(jié)果婚禮上筛璧,老公的妹妹穿的比我還像新娘逸绎。我一直安慰自己,他們只是感情好夭谤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布棺牧。 她就那樣靜靜地躺著,像睡著了一般朗儒。 火紅的嫁衣襯著肌膚如雪颊乘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天采蚀,我揣著相機(jī)與錄音疲牵,去河邊找鬼。 笑死榆鼠,一個(gè)胖子當(dāng)著我的面吹牛纲爸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妆够,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼识啦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了神妹?” 一聲冷哼從身側(cè)響起颓哮,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸵荠,沒想到半個(gè)月后冕茅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年姨伤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哨坪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乍楚,死狀恐怖当编,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徒溪,我是刑警寧澤忿偷,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站臊泌,受9級(jí)特大地震影響鲤桥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缺虐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一芜壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧高氮,春花似錦慧妄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罪裹,卻和暖如春饱普,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背状共。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工套耕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峡继。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓冯袍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碾牌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子康愤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 學(xué)習(xí)Android的同學(xué)注意了!2奥稹征冷!學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Android學(xué)習(xí)交流群...
    kingZXY2009閱讀 333評(píng)論 0 0
  • 前言誓琼,本來只是想研究一下注解的检激,不過發(fā)現(xiàn)肴捉,要懂注解先得懂反射,別問我為什么叔收,你可以自己試試 JAVA反射 主要是指...
    justCode_閱讀 1,222評(píng)論 2 9
  • 獲取反射類的三種方法: 1. Class.forName("類所在的包和類名"); Class class1 = ...
    YaphetS081閱讀 348評(píng)論 0 0
  • Java反射機(jī)制 前言 網(wǎng)頁版的jdk的API離線版API 什么是反射機(jī)制 反射是java語言的一個(gè)特性每庆,它允程序...
    愛撒謊的男孩閱讀 351評(píng)論 0 3
  • 當(dāng)我們做錯(cuò)事情的時(shí)候不應(yīng)該去埋怨別人或是給自己找一些借口,首先我們要從自身找原因今穿,改變不了她人,可以改變自己伦籍!
    Ding欣欣閱讀 202評(píng)論 0 2