invoke過程

Object result = method.invoke(bean);

反射(Reflection)是Java 程序開發(fā)語言的特征之一潘拱,它允許運行中的 Java 程序獲取自身的信息疹鳄,并且可以操作類或?qū)ο蟮膬?nèi)部屬性。

程序中對象的類型都是在編譯期就確定下來的芦岂,而Java反射機制可以動態(tài)地創(chuàng)建對象并調(diào)用其屬性瘪弓。但在有的時候并沒有進行編譯期就要直接使用,比如class.forName方法禽最。

反射的核心是JVM在運行時才動態(tài)加載類或調(diào)用方法/訪問屬性腺怯,它不需要事先(寫代碼的時候或編譯期)知道對象的類型。

Java反射框架主要提供以下功能:
1.在運行時動態(tài)進行類加載弛随;
2.在運行時創(chuàng)建一個對象瓢喉;
3.在運行時獲取類(對象)的任意成員變量和方法
4.在運行時調(diào)用任意一個對象的方法(通過反射甚至可以調(diào)用private方法);
重點是運行時而不是編譯時

當我們在使用IDE(如Eclipse舀透,IDEA)時栓票,當我們輸入一個對象或類并想調(diào)用它的屬性或方法時,一按點號愕够,編譯器就會自動列出它的屬性或方法走贪,這里就會用到反射。

反射最重要的用途就是開發(fā)各種通用框架惑芭。
很多框架(比如Spring)都是配置化的(比如通過XML文件配置JavaBean,Action之類的)坠狡,為了保證框架的通用性,它們可能需要根據(jù)配置文件加載不同的對象或類遂跟,調(diào)用不同的方法逃沿,這個時候就必須用到反射——運行時動態(tài)加載需要加載的對象。

<action name="login"   class="org.ScZyhSoft.test.action.SimpleLoginAction"  method="execute">
       <result>index.jsp</result>
       <result name="error">login.jsp</result>
 </action>

配置文件與Action建立了一種映射關系幻锁,當View層發(fā)出請求時凯亮,請求會被StrutsPrepareAndExecuteFilter攔截,然后StrutsPrepareAndExecuteFilter會去動態(tài)地創(chuàng)建Action實例哄尔。
struts與spring mvc的區(qū)別是struts是原型的假消,springmvc是單列的。

獲得Class對象的三種方法:
(1)使用Class類的forName靜態(tài)方法
(2)直接獲取某一個對象的class岭接,比如 a.class
(3)調(diào)用某個對象的getClass()方法,比如 a.getClass()

instanceof 和 isInstance區(qū)別:

obj instanceof Type
class.isInstance(obj)

        System.out.println("ok" instanceof  String);
        System.out.println("ok".getClass().isInstance(""));

通過反射來生成對象主要有兩種方式:
(1)使用Class對象的newInstance()方法來創(chuàng)建Class對象對應類的實例
(2)先通過Class對象獲取指定的Constructor對象富拗,再調(diào)用Constructor對象的newInstance()方法來創(chuàng)建實例臼予。這種方法可以用指定的構(gòu)造器構(gòu)造類的實例:

      //獲取String所對應的Class對象
      Class<?> c = String.class;
      //獲取String類帶一個String參數(shù)的構(gòu)造器
      Constructor constructor = c.getConstructor(String.class);
      //根據(jù)構(gòu)造器創(chuàng)建實例
      Object obj = constructor.newInstance("23333");
      System.out.println(obj);

獲取某個Class對象的方法集合,主要有以下幾個方法:
getDeclaredMethods()方法返回類或接口聲明的所有方法啃沪,包括公共粘拾、保護谅阿、默認(包)訪問和私有方法半哟,但不包括繼承的方法签餐。

public Method[] getDeclaredMethods() throws SecurityException

getMethods()方法返回某個類的所有公用(public)方法,包括其繼承類的公用方法戒良。

public Method[] getMethods() throws SecurityException

getMethod方法返回一個特定的方法冠摄,其中第一個參數(shù)為方法名稱糯崎,后面的參數(shù)為方法的參數(shù)對應Class的對象

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

獲取類的成員變量(字段)信息,直接使用較少河泳,因為變量一般為私有的。

getFiled: 訪問公有的成員變量
getDeclaredField:所有已聲明的成員變量薄霜。但不能得到其父類的成員變量
getFileds和getDeclaredFields用法同上(參照Method)

當我們從類中獲取了一個方法后纸兔,我們就可以用invoke()方法來調(diào)用這個方法惰瓜。invoke方法的原型為:

public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException

反射調(diào)用方法時可以忽略權(quán)限檢查汉矿,因此可能會破壞封裝性而導致安全問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奈揍,一起剝皮案震驚了整個濱河市赋续,隨后出現(xiàn)的幾起案子打月,更是在濱河造成了極大的恐慌蚕捉,老刑警劉巖柴淘,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秘通,死亡現(xiàn)場離奇詭異敛熬,居然都是意外死亡,警方通過查閱死者的電腦和手機应民,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁仁,“玉大人归园,你說我怎么就攤上這事∮褂眨” “怎么了捻浦?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵桥爽,是天一觀的道長。 經(jīng)常有香客問我盗扒,道長形导,這世上最難降的妖魔是什么环疼? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任炫隶,我火速辦了婚禮,結(jié)果婚禮上伪阶,老公的妹妹穿的比我還像新娘处嫌。我一直安慰自己栅贴,他們只是感情好熏迹,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般墓猎。 火紅的嫁衣襯著肌膚如雪赚楚。 梳的紋絲不亂的頭發(fā)上毙沾,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天宠页,我揣著相機與錄音,去河邊找鬼举户。 笑死,一個胖子當著我的面吹牛敛摘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兄淫,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼捕虽,長吁一口氣:“原來是場噩夢啊……” “哼慨丐!你這毒婦竟也來了泄私?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捅暴,失蹤者是張志新(化名)和其女友劉穎咧纠,沒想到半個月后蓬痒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漆羔,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年亲轨,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸟顺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦锋,靈堂內(nèi)的尸體忽然破棺而出曾撤,到底是詐尸還是另有隱情晕粪,我是刑警寧澤渐裸,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站昏鹃,受9級特大地震影響尚氛,放射性物質(zhì)發(fā)生泄漏洞渤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望护昧。 院中可真熱鬧,春花似錦惋耙、人聲如沸捣炬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推溃。三九已至,卻和暖如春冲粤,著一層夾襖步出監(jiān)牢的瞬間美莫,已是汗流浹背梯捕。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工傀顾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留襟铭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓赐劣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哩都。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咐汞,服務發(fā)現(xiàn)儒鹿,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉植阴,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評論 0 9
  • 之前搭建了Shipyard圾浅,可以對鏡像、容器惨撇、Node進行管理府寒,但在添加registry時出錯啦魁衙。 試錯1:剛開始...
    灼灼2015閱讀 4,662評論 3 6
  • 人逢喜事精神爽捌刮,古人誠不欺我。最近舒岸,蘇沫一直處于亢奮忙碌狀態(tài),就連她先生都不無羨慕地說俄认,做蘇沫的弟弟,真是太幸福了...
    夢宇星月夜閱讀 255評論 0 0