JAVA反射機制

JAVA反射機制

JAVA反射機制是在運行狀態(tài)中,對于任意一個類痴腌,都能夠知道這個類的所有屬性和方法雌团;對于任意一個對象,都能夠調用它的任意一個方法士聪;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為java語言的反射機制锦援。

Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象剥悟;在運行時判斷任意一個類所具有的成員變量和方法灵寺;在運行時調用任意一個對象的方法曼库;生成動態(tài)代理。

1. 得到某個對象的屬性

Java代碼

? ? 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)屬性

Java代碼

? ? 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í)行某對象的方法

Java代碼

? ? 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行:配置參數的Class數組碌秸,作為尋找Method的條件绍移。

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

method.invoke(owner, args):執(zhí)行該Method.invoke方法的參數是執(zhí)行這個方法的對象owner讥电,和參數數組args蹂窖,可以這么理解:owner對象中帶有參數args的method方法。返回值是Object恩敌,也既是該方法的返回值瞬测。

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

Java代碼

? ? 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的一個參數是null月趟,因為這是靜態(tài)方法,不需要借助實例運行恢口。

5. 新建實例

Java代碼

? ? 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í)行帶參數的構造函數來新建實例的方法孝宗。如果不需要參數,可以直接使用newoneClass.newInstance()來實現耕肩。

Class newoneClass = Class.forName(className):第一步因妇,得到要構造的實例的Class。

第5~第9行:得到參數的Class數組猿诸。

Constructor cons = newoneClass.getConstructor(argsClass):得到構造子婚被。

cons.newInstance(args):新建實例。

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

Java代碼

? ? public boolean isInstance(Object obj, Class cls) {?

? ? ? ? return cls.isInstance(obj);?

? ? }?

7. 得到數組中的某個元素

Java代碼

? ? public Object getByArray(Object array, int index) {?

? ? ? ? return Array.get(array,index);?

? ? }?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末两芳,一起剝皮案震驚了整個濱河市摔寨,隨后出現的幾起案子,更是在濱河造成了極大的恐慌怖辆,老刑警劉巖是复,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異竖螃,居然都是意外死亡淑廊,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門特咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來季惩,“玉大人,你說我怎么就攤上這事腻格』埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵菜职,是天一觀的道長青抛。 經常有香客問我,道長酬核,這世上最難降的妖魔是什么蜜另? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嫡意,結果婚禮上举瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己蔬螟,他們只是感情好此迅,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旧巾,像睡著了一般耸序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菠齿,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天佑吝,我揣著相機與錄音,去河邊找鬼绳匀。 笑死芋忿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疾棵。 我是一名探鬼主播戈钢,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼是尔!你這毒婦竟也來了殉了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拟枚,失蹤者是張志新(化名)和其女友劉穎薪铜,沒想到半個月后众弓,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡隔箍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年谓娃,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒滩。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡滨达,死狀恐怖,靈堂內的尸體忽然破棺而出俯艰,到底是詐尸還是另有隱情捡遍,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布竹握,位于F島的核電站画株,受9級特大地震影響,放射性物質發(fā)生泄漏涩搓。R本人自食惡果不足惜污秆,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昧甘。 院中可真熱鬧良拼,春花似錦、人聲如沸充边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇冰。三九已至贬媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肘习,已是汗流浹背际乘。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漂佩,地道東北人脖含。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像投蝉,于是被迫代替她去往敵國和親养葵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348