Java反射


能夠分析類能力的程序稱為反射(reflective)瓣窄,反射機制可以用來:

  • 在運行時分析類的能力。
  • 在運行時查看對象维费,例如怔毛,編寫一個toString方法供所有類使用员萍。
  • 實現(xiàn)通用的數(shù)組操作代碼。
  • 利用Method對象拣度,這個對象很像C++中的函數(shù)指針碎绎。

1. Class類

  • 一個Class類對象表示一個特定類的屬性。在程序運行期間抗果,Java運行時系統(tǒng)始終為所有的對象維護一個被稱為運行時的類型標(biāo)識筋帖,虛擬機利用運行時類信息選擇相應(yīng)的方法執(zhí)行。
  • 獲得類名對應(yīng)的Class對象
String className = "java.util.Random";
Class cl = Class.forName(className);    //調(diào)用Class的靜態(tài)方法
  • Class對象實際上表示的是一個類型冤馏,而這個類型可以是int日麸,即int.Class也是一個Class對象。
  • Class實際上是一個泛型類逮光。
  • 實現(xiàn)兩個類對象的比較代箭,利用 == 運算符
if(employ.getClass() == Employee.class){...}
  • 動態(tài)創(chuàng)建一個類實例
String s = "java.util.Random"
Object m = Class.forName(s).newInstance();  //class.newInstance()方法

2. 利用反射分析類的能力

  • java.lang.reflect包中有三個類FieldMethodConstructor分別用于描述類的域涕刚、方法和構(gòu)造器
  1. Field嗡综、MethodConstructor這三個類中具有如下方法
  • String getName() 返回一個用于描述構(gòu)造器、方法或域名的字符串杜漠。
  • int getModifiers() 返回一個用于描述構(gòu)造器极景、方法或域的修飾符的整型數(shù)值,使用Modifier.isPublic(int i)等方法可以分析這個返回值碑幅。
  • Class getDeclaringClass()返回一個用于描述構(gòu)造器、方法或域的Class對象塞绿。
  • Class getReturnType()(僅在Method類中)沟涨,返回方法的返回類型的Class
  • Class[] getParameterTypes()(僅在Constructor和Method類中),返回一個用于描述參數(shù)類型的Class對象數(shù)組异吻。
  1. Class類中的方法
  • Field[] getFields()返回這個類或其超類的公有域裹赴。
  • Field[] getDeclaredFields()返回類的全部域。這兩個方法诀浪,如果類中沒有域或者是基本類型或是數(shù)組類型棋返,兩個方法返回長度為0的數(shù)組。
  • Method[] getMethods() 返回所有的公有方法雷猪,包括超類的方法睛竣。
  • Method[] getDeclaredMethods() 返回類或接口中所有方法,但不包括超類繼承的方法求摇。
  • Constructor[] getConstructors() 返回公有構(gòu)造器射沟。
  • Constructor[] getDeclaredConstructors() 返回所有構(gòu)造器殊者。

3. 在運行時使用反射分析對象

  • 獲取類中某個域的值,如:
Employee harry = new Employee("Harry Hacker", 3500, 10, 1, 1989);
Class cl = harry.getClass();
Field field = cl.getDeclaredField("name");
Object v = field.get(harry);    //v應(yīng)該是String類的對象"Harry Hacker"
field.set(harry, "Amy");    //harry對象的name被改為"Amy"
  • 覆蓋訪問控制setAccessible(boolean)
field.setAccessible(true);  //若該域是private的验夯,設(shè)置為true之后則可以訪問
field.isAccessiable()   //返回反射對象的可訪問標(biāo)志的值
  • Class類
    Field getField(String name)
    Field[] getField()
    返回指定名稱的公有域猖吴,或包含所有域的數(shù)組。

3. 使用反射編寫泛型數(shù)組代碼

  • 整數(shù)類型int[]可以被轉(zhuǎn)換成Object挥转,但不能轉(zhuǎn)換成對象數(shù)組Object[]海蔽。
  • 返回一個具有給定類型、給定維數(shù)的新數(shù)組
static Object newInstance(Class componentType, int length);
static Object newInstance(Class componentType, int[] lengths);

4. 調(diào)用任意方法

  • Class獲得指定方法
Method getMethod(String name, Class... parameters);
  • Method調(diào)用該方法
pubilc Object invoke(Object implicitParameter, Object... explicitParameters);

第一個參數(shù)是隱式參數(shù)绑谣,其余的參數(shù)提供了顯示參數(shù)(沒有顯示傳參就傳遞一個null)党窜,對于靜態(tài)方法,第一個參數(shù)可以忽略設(shè)置為null域仇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刑然,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暇务,更是在濱河造成了極大的恐慌泼掠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦细,死亡現(xiàn)場離奇詭異择镇,居然都是意外死亡,警方通過查閱死者的電腦和手機括改,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門腻豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘱能,你說我怎么就攤上這事吝梅。” “怎么了惹骂?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵苏携,是天一觀的道長。 經(jīng)常有香客問我对粪,道長右冻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任著拭,我火速辦了婚禮纱扭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘儡遮。我一直安慰自己乳蛾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屡久,像睡著了一般忆首。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上被环,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天糙及,我揣著相機與錄音,去河邊找鬼筛欢。 笑死浸锨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的版姑。 我是一名探鬼主播柱搜,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剥险!你這毒婦竟也來了聪蘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤表制,失蹤者是張志新(化名)和其女友劉穎健爬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體么介,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡娜遵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壤短。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片设拟。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖久脯,靈堂內(nèi)的尸體忽然破棺而出纳胧,到底是詐尸還是另有隱情,我是刑警寧澤帘撰,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布跑慕,位于F島的核電站,受9級特大地震影響骡和,放射性物質(zhì)發(fā)生泄漏相赁。R本人自食惡果不足惜相寇,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一慰于、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唤衫,春花似錦婆赠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛆挫。三九已至,卻和暖如春妙黍,著一層夾襖步出監(jiān)牢的瞬間悴侵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工拭嫁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留可免,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓做粤,卻偏偏與公主長得像浇借,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怕品,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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