Java反射用法2 : 類成員(Class Members)

一、什么是類的成員叉瘩?

眾所周知器罐,Java反射可以在運(yùn)行時(shí)獲取類的成員。那么問(wèn)題來(lái)了垒棋,什么是類的成員呢?一起來(lái)看一下Java 7給出的官方解釋:

According to The Java Language Specification, Java SE 7 Edition, the members of a class are the inherited components of the class body including fields, methods, nested classes, interfaces, and enumerated types. Since constructors are not inherited, they are not members. This differs from the implementing classes of java.lang.reflect.Member.

以上信息可以理解為:

類的成員包括:從父類繼承得到的成員變量,方法;內(nèi)嵌的類耻姥,接口,枚舉類型有咨。因?yàn)闃?gòu)造方法無(wú)法被繼承,所以不是類成員蒸健。

二座享、成員變量(field)

1. 獲取成員變量

先來(lái)看一個(gè)對(duì)ClassAPI中獲取成員變量方法的總結(jié)婉商。

Class API 通過(guò)List返回多個(gè)成員變量 返回父類成員變量 返回私有成員變量
getDeclaredField() no no yes
getField() no yes no
getDeclaredFields() yes no yes
getFields() yes yes no

Class對(duì)象提供了四種方法來(lái)獲取類的成員變量,其中getDeclaredField()getField()都是需要通過(guò)提供變量名稱來(lái)獲取單一成員變量渣叛。getFields()getDeclaredFields()則可以通過(guò)鏈返回多個(gè)成員變量丈秩。

Class c = ... // 獲取Class對(duì)象
Field field = c.getField("fieldName") // 通過(guò)成員變量名稱獲取
Field[] fields = c.getFields() // 獲取公有成員變量,包括父類的公有成員變量

通過(guò)以上表淳衙,我們可以得知無(wú)法通過(guò)這四種方法來(lái)獲取父類的私有成員變量蘑秽。

2. 獲取成員變量的名字、類型和修飾器

(1). 名字
通過(guò)Field類的Field.getName()來(lái)獲取變量名

Field field = ... // 獲取成員變量對(duì)象
String fieldName = field.getName();

(2). 類型
通過(guò)Field類的Field.getType()來(lái)獲取變量類型

Class c = String.class; // String 類
Field[] fields = c.getFields(); // 獲取String類的成員變量
Object fieldType = fields[0].getType(); // 獲取變量類型

(3). 修飾器
通過(guò)Field類的Field.getModifiers()來(lái)獲取變量類型

Class c = String.class; // String 類
Field[] fields = c.getFields(); // 獲取String類的成員變量
int modifier = fields[0].getModifiers(); // 所有修飾器都對(duì)應(yīng)到了一個(gè)整型數(shù)值
Modifier.toString(modifier); // 將整型數(shù)值轉(zhuǎn)成相應(yīng)的修飾器字符串

Field 類還提供了Field.isSynthetic()Field.isEnumConstant()方法箫攀。前者確定變量是否是合成的肠牲,后者確定變量是否屬于枚舉常量。

3. 獲取成員變量值靴跛、對(duì)成員變量賦值

Class c = MyObject.class;
Field field = c.getField("fieldName"); 

MyObject newInstance = new MyObject(); // 創(chuàng)建對(duì)象實(shí)例

Object value = field.get(newInstance); // 從對(duì)象實(shí)例中獲取成員變量的值

field.set(newInstance, value); // 對(duì)成員變量進(jìn)行賦值

三缀雳、方法(method)

先看對(duì)ClassAPI中獲取method途徑的總結(jié)。

Class API 通過(guò)List返回多個(gè)方法 返回父類方法 返回私有方法
getDeclaredMethod() no no yes
getMethod() no yes no
getDeclaredMethods() yes no yes
getMethods() yes yes no

獲取方法(method)同樣有四種途徑梢睛,具體差別和獲取成員變量一樣肥印,不再贅述。

需注意的是:使用getMethod()getDeclaredMethod()時(shí)需要給出參數(shù)的類型绝葡,不帶參數(shù)時(shí)則要給出null深碱。比較神奇的是:當(dāng)參數(shù)時(shí)原始值(primitive)類型時(shí),你可以直接用int.class藏畅,boolean.class等作為參數(shù)類型敷硅。

Class c = String.class;
Method method1 = c.getMethod("charAt", int.class); // 通過(guò)方法名和參數(shù)類型int獲取方法
Method method1 = c.getMethod("getBytes", new Class[]{String.class}); // 通過(guò)方法名和參數(shù)類型String獲取方法

String methodName = method1.getName(); // 獲取方法名

1. 獲取類方法的參數(shù)類型和返回類型(Return Type)

Method method = ... // 獲取方法
Class[] parameterTypes = method.getParameterTypes(); //獲取參數(shù)類型
Class returnType = method.getReturnType(); // 獲取返回類型

2. 獲取類方法的修飾器

Method method = ... 
int modifier = method.getModifiers();

3. 檢查參數(shù)數(shù)量是否確定

Method method = ... 
boolean varArgs = method.isVarArgs();

4. 調(diào)用方法(method)

通過(guò)Methodinvoke()調(diào)用方法

Method method = String.class.getMethod("charAt", int.class);
Char returnValue = method.invoke("Hello", 4);

參考文獻(xiàn)


Java Reflection - Tutorials
Java Reflection - Fields
Java Reflection - Methods

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墓赴,隨后出現(xiàn)的幾起案子竞膳,更是在濱河造成了極大的恐慌,老刑警劉巖诫硕,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦辟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡章办,警方通過(guò)查閱死者的電腦和手機(jī)锉走,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)藕届,“玉大人挪蹭,你說(shuō)我怎么就攤上這事⌒菖迹” “怎么了梁厉?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我词顾,道長(zhǎng)八秃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任肉盹,我火速辦了婚禮昔驱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘上忍。我一直安慰自己骤肛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窍蓝。 她就那樣靜靜地躺著腋颠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪它抱。 梳的紋絲不亂的頭發(fā)上秕豫,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音观蓄,去河邊找鬼混移。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侮穿,可吹牛的內(nèi)容都是我干的歌径。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亲茅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼回铛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起克锣,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茵肃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袭祟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體验残,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年巾乳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了您没。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胆绊,死狀恐怖氨鹏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情压状,我是刑警寧澤仆抵,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響肢础,放射性物質(zhì)發(fā)生泄漏还栓。R本人自食惡果不足惜碌廓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一传轰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谷婆,春花似錦慨蛙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至异袄,卻和暖如春通砍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烤蜕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工封孙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讽营。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓虎忌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親橱鹏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膜蠢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2莉兰、Retrofit解析...
    隔壁老李頭閱讀 4,577評(píng)論 2 12
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理挑围,服務(wù)發(fā)現(xiàn),斷路器糖荒,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法杉辙,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法寂嘉,繼承相關(guān)的語(yǔ)法奏瞬,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 世上沒(méi)有現(xiàn)成的夢(mèng)想泉孩,清晰的夢(mèng)想是在職業(yè)中通過(guò)自我修煉硼端、思考、經(jīng)歷和觀察而發(fā)展出來(lái)的寓搬。
    夏夢(mèng)之生涯閱讀 113評(píng)論 0 0
  • 小康是小周的追求者,禮拜六要約小周吃晚飯镣典,他首先發(fā)了一句兔毙,禮拜六有空嗎?一起吃晚飯兄春。 然后澎剥,小周回了一句,這周六可...
    大雄___閱讀 388評(píng)論 5 9