Java反射機(jī)制詳解及Method.invoke解釋

Java反射機(jī)制

JAVA反射機(jī)制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個的所有屬性和方法;對于任意一個對象擅耽,都能夠調(diào)用它的任意一個方法;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能成為java語言的反射機(jī)制物遇。
反射機(jī)制主要提供了如下幾種功能:
1乖仇、在運行時判斷任意一個對象所屬的類
2、在運行時構(gòu)造任意一個類的對象
3询兴、在運行時判斷任意一個類所具有的成員變量和方法
4乃沙、在運行時調(diào)用任意一個對象的方法
5、生成動態(tài)代理

代碼示例:
1.得到某個對象的屬性

public Object getProperty(Object owner, String fieldName) throws Exception {  
     Class ownerClass = owner.getClass();  
   
     Field field = ownerClass.getField(fieldName);  
   
     Object property = field.get(owner);  
   
     return property;  
}

Class ownerClass = owner.getClass():得到該對象的Class诗舰。
Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性警儒。
Object property = field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的眶根,這里會報IllegalAccessException蜀铲。

2.得到某個類的靜態(tài)屬性:

public Object getStaticProperty(String className, String fieldName)  
             throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Field field = ownerClass.getField(fieldName);  
   
     Object property = field.get(ownerClass);  
   
     return property;  
}  

Class ownerClass = Class.forName(className) :首先得到這個類的Class边琉。
Field field = ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性蝙茶。
Object property = field.get(ownerClass) :這里和上面有些不同艺骂,因為該屬性是靜態(tài)的,所以直接從類的Class里取隆夯。

3.執(zhí)行某對象的方法:

public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {  
   
     Class ownerClass = owner.getClass();  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
  
      Method method = ownerClass.getMethod(methodName,argsClass);  
   
     return method.invoke(owner, args);  
}  

Class owner_class = owner.getClass() :首先還是必須得到這個對象的Class钳恕。

5~9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件蹄衷。

Method method = ownerClass.getMethod(methodName, argsClass):通過methodName和參數(shù)的argsClass(方法中的參數(shù)類型集合)數(shù)組得到要執(zhí)行的Method忧额。

method.invoke(owner, args):執(zhí)行該Method.invoke方法的參數(shù)是執(zhí)行這個方法的對象owner,和參數(shù)數(shù)組args愧口,可以這么理解:owner對象中帶有參數(shù)args的method方法睦番。返回值是Object,也既是該方法的返回值耍属。

4.執(zhí)行某個類的靜態(tài)方法:

public Object invokeStaticMethod(String className, String methodName,  
             Object[] args) throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
    Method method = ownerClass.getMethod(methodName,argsClass);  
   
     return method.invoke(null, args);  
 }  

基本的原理和實例3相同托嚣,不同點是最后一行,invoke的一個參數(shù)是null厚骗,因為這是靜態(tài)方法示启,不需要借助實例運行。

5.新建實例:

public Object newInstance(String className, Object[] args) throws Exception {  
     Class newoneClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
     Constructor cons = newoneClass.getConstructor(argsClass);  
   
     return cons.newInstance(args);  
   
}  

這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實例的方法领舰。如果不需要參數(shù)夫嗓,可以直接使用newoneClass.newInstance()來實現(xiàn)。
Class newoneClass = Class.forName(className):第一步冲秽,得到要構(gòu)造的實例的Class舍咖。
第5~第9行:得到參數(shù)的Class數(shù)組。
Constructor cons = newoneClass.getConstructor(argsClass):得到構(gòu)造子锉桑。
cons.newInstance(args):新建實例排霉。

6.判斷是否為某個類的實例:

public boolean isInstance(Object obj, Class cls) {  
     return cls.isInstance(obj);  
}  

7.得到數(shù)組中的某個元素:

public Object getByArray(Object array, int index) {  
     return Array.get(array,index);  
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市民轴,隨后出現(xiàn)的幾起案子攻柠,更是在濱河造成了極大的恐慌,老刑警劉巖杉武,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辙售,居然都是意外死亡轻抱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門旦部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祈搜,“玉大人较店,你說我怎么就攤上這事∪菅啵” “怎么了梁呈?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘸秘。 經(jīng)常有香客問我官卡,道長,這世上最難降的妖魔是什么醋虏? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任寻咒,我火速辦了婚禮,結(jié)果婚禮上颈嚼,老公的妹妹穿的比我還像新娘毛秘。我一直安慰自己,他們只是感情好阻课,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布叫挟。 她就那樣靜靜地躺著,像睡著了一般限煞。 火紅的嫁衣襯著肌膚如雪抹恳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天晰骑,我揣著相機(jī)與錄音适秩,去河邊找鬼。 笑死硕舆,一個胖子當(dāng)著我的面吹牛秽荞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抚官,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扬跋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凌节?” 一聲冷哼從身側(cè)響起钦听,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倍奢,沒想到半個月后朴上,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡卒煞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年痪宰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣撬,死狀恐怖乖订,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情具练,我是刑警寧澤乍构,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站扛点,受9級特大地震影響哥遮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜占键,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一昔善、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畔乙,春花似錦君仆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牍鞠,卻和暖如春咖摹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背难述。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工萤晴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胁后。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓店读,卻偏偏與公主長得像,于是被迫代替她去往敵國和親攀芯。 傳聞我的和親對象是個殘疾皇子屯断,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 1JAVA反射機(jī)制JAVA反射機(jī)制是在運行狀態(tài)中,對于任意一個類侣诺,都能夠知道這個類的所有屬性和方法殖演;對于任意一個對...
    shenyoujian閱讀 374評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)年鸳,斷路器趴久,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,681評論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法搔确,類相關(guān)的語法彼棍,內(nèi)部類的語法已添,繼承相關(guān)的語法,異常的語法滥酥,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 年少時 我寫了一首小詩 一句一句,像是畫著你 年輕時 我離開了故鄉(xiāng) 一眼一眼畦幢,像是望著你 年老時 你站在我身旁 一...
    江阿蘺閱讀 284評論 0 1