反射之二

總結(jié)內(nèi)容源自一下文章
粗淺看java反射機制
反射機制應(yīng)用實踐
談?wù)刯ava反射機制
Java Reflection(反射機制)詳解

八、獲取類的 Method

通過反射機制得到某個類的某個方法,然后調(diào)用對應(yīng)于這個類的某個實例的該方法

Class<T>類提供了幾個方法獲取類的方法肖爵。

public Method getMethod(String name, Class<?>... parameterTypes)

public Method[] getMethods()

public Method getDeclaredMethod(Stringname,Class<?> parameterTypes)

public Method[] getDeclaredMethods()

getMethod()返回一個 Method 對象杨刨,它反映此 Class 對象所表示的類或接口的指定公共成員方法惭缰;

getMethods()返回一個包含某些 Method 對象的數(shù)組,這些對象反映此Class 對象所表 示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那 些的類或接口)的公共 member 方法解取;

getDeclaredMethod()返回一個 Method 對象愈案,該對象反映此Class對象所表示的類或接口的指定已聲明方法挺尾;

getDeclaredMethods()返回 Method對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法站绪,包括公共遭铺、保護、默認(包)訪問和私有方法恢准,但不包括繼承的方法魂挂。

如果知道要調(diào)用方法的具體參數(shù)類型,就可以直接通過參數(shù)類型來獲取指定的方法馁筐,下面這個例子中返回方法對象名稱是“testPrivateMethod”涂召,他的方法參數(shù)是 String 類型:

try {
    Method privateMethod = classType.getDeclaredMethod("testPrivateMethod", new Class[]{String.class});
    System.out.println(privateMethod);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

方法參數(shù)以及返回類型

獲取指定方法的方法參數(shù)是哪些:

Method method = ... //獲取Class對象
Class[] parameterTypes = method.getParameterTypes();

獲取指定方法的返回類型:

Method method = ... //獲取Class對象
Class returnType = method.getReturnType();

通過 Method 對象調(diào)用方法
可以通過如下方式來調(diào)用一個方法:

//獲取一個方法名為doSomesthing,參數(shù)類型為String的方法
Method method = MyObject.class.getMethod("doSomething", String.class);
Object returnValue = method.invoke(null, "parameter-value1"); // 靜態(tài)方法第一個參數(shù)直接傳遞null

傳入的 null 參數(shù)是要調(diào)用方法的對象敏沉,如果是一個靜態(tài)方法調(diào)用的話則可以用 null 代替指定對象作為 invoke()的參數(shù)果正,在上面這個例子中,如果 doSomething 不是靜態(tài)方法的話盟迟,你就要傳入有效的 MyObject 實例而不是 null秋泳。 Method.invoke(Object target, Object … parameters)方法的第二個參數(shù)是一個可變參數(shù)列表,但是你必須要傳入與你要調(diào)用方法的形參一一對應(yīng)的實參攒菠。就像上個例子那樣迫皱,方法需要 String 類型的參數(shù),那我們必須要傳入一個字符串辖众。

如果方法為私有方法卓起,則需要先改變訪問權(quán)限,同時赵辕,需要捕獲異常:

try {
    Method privateMethod = ... //獲取method
    privateMethod.setAccessible(true);
    privateMethod.invoke(null, "meth-reflection");  // 第二個參數(shù)為函數(shù)需要的參數(shù)列表既绩,類型為 Object... args
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();

九、父類

通過 Class 對象你可以訪問類的父類还惠,如下例:

Class superclass = aClass.getSuperclass();

可以看到 superclass 對象其實就是一個 Class 類的實例饲握,所以可以繼續(xù)在這個對象上進行反射操作。

十蚕键、實現(xiàn)的接口

可以通過如下方式獲取指定類所實現(xiàn)的接口集合:

Class  aClass = ... //獲取Class對象救欧,具體方式可見Class對象小節(jié)
Class[] interfaces = aClass.getInterfaces();

由于一個類可以實現(xiàn)多個接口,因此 getInterfaces(); 方法返回一個 Class 數(shù)組锣光,在 Java 中接口同樣有對應(yīng)的 Class 對象笆怠。 注意:getInterfaces() 方法僅僅只返回當(dāng)前類所實現(xiàn)的接口。當(dāng)前類的父類如果實現(xiàn)了接口誊爹,這些接口是不會在返回的 Class 集合中的蹬刷,盡管實際上當(dāng)前類其實已經(jīng)實現(xiàn)了父類接口瓢捉。

Class<?> hashMapClass = HashMap.class;
Class<?> [] interfaces = hashMapClass.getInterfaces();
for (Class<?> interf : interfaces) {
    System.out.println(interf);
}
System.out.println();
Class<?> superClass = hashMapClass.getSuperclass();
System.out.println(superClass);

十一、構(gòu)造器

我們可以通過 Class 對象來獲取 Constructor 類的實例:

Class aClass = ...//獲取Class對象
Constructor[] constructors = aClass.getConstructors();

返回的 Constructor 數(shù)組包含每一個聲明為公有的(Public)構(gòu)造方法办成。 如果知道要訪問的構(gòu)造方法的方法參數(shù)類型泡态,你可以用下面的方法獲取指定的構(gòu)造方法,這例子返回的構(gòu)造方法的方法參數(shù)為 String 類型:

Class aClass = ...//獲取Class對象
Constructor constructor = aClass.getConstructor(new Class[]{String.class});

如果沒有指定的構(gòu)造方法能滿足匹配的方法參數(shù)則會拋出:NoSuchMethodException迂卢。

構(gòu)造方法參數(shù)
通過如下方式獲取指定構(gòu)造方法的方法參數(shù)信息:

Constructor constructor = ... //獲取Constructor對象
Class[] parameterTypes = constructor.getParameterTypes();

利用 Constructor 對象實例化一個類
可以通過如下方法實例化一個類:

Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");

constructor.newInstance()方法的方法參數(shù)是一個可變參數(shù)列表某弦,但是當(dāng)調(diào)用構(gòu)造方法的時候必須提供精確的參數(shù),即形參與實參必須一一對應(yīng)而克。在這個例子中構(gòu)造方法需要一個 String 類型的參數(shù)靶壮,那我們在調(diào)用 newInstance 方法的時候就必須傳入一個 String 類型的參數(shù)。

調(diào)用類的 Class對象的 newInstance方法员萍,該方法會調(diào)用對象的默認構(gòu)造器腾降,如果沒有默認構(gòu)造器,會調(diào)用失敗.

aClass.newInstance();  //直接調(diào)用類的newInstance()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末充活,一起剝皮案震驚了整個濱河市蜂莉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌混卵,老刑警劉巖映穗,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幕随,居然都是意外死亡蚁滋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門赘淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辕录,“玉大人,你說我怎么就攤上這事梢卸∽叩” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蛤高,是天一觀的道長蚣旱。 經(jīng)常有香客問我,道長戴陡,這世上最難降的妖魔是什么塞绿? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恤批,結(jié)果婚禮上异吻,老公的妹妹穿的比我還像新娘。我一直安慰自己喜庞,他們只是感情好诀浪,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布棋返。 她就那樣靜靜地躺著,像睡著了一般笋妥。 火紅的嫁衣襯著肌膚如雪懊昨。 梳的紋絲不亂的頭發(fā)上窄潭,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天春宣,我揣著相機與錄音,去河邊找鬼嫉你。 笑死月帝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幽污。 我是一名探鬼主播嚷辅,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼距误!你這毒婦竟也來了簸搞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤准潭,失蹤者是張志新(化名)和其女友劉穎趁俊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刑然,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡寺擂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泼掠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔软。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖择镇,靈堂內(nèi)的尸體忽然破棺而出挡逼,到底是詐尸還是另有隱情,我是刑警寧澤腻豌,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布家坎,位于F島的核電站,受9級特大地震影響饲梭,放射性物質(zhì)發(fā)生泄漏乘盖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一憔涉、第九天 我趴在偏房一處隱蔽的房頂上張望订框。 院中可真熱鬧,春花似錦兜叨、人聲如沸穿扳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矛物。三九已至茫死,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間履羞,已是汗流浹背峦萎。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忆首,地道東北人爱榔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像糙及,于是被迫代替她去往敵國和親详幽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法浸锨,類相關(guān)的語法唇聘,內(nèi)部類的語法,繼承相關(guān)的語法柱搜,異常的語法迟郎,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)冯凹,斷路器谎亩,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評論 6 13
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評論 0 9
  • 一廂情愿的主題簡介:命運的:造物弄人宇姚。 夢想和愛情的距離匈庭。 我們要好好的為自己活,我們要好好的保護我們愛的人浑劳,我們...
    導(dǎo)演張升志閱讀 362評論 0 0