什么是反射?
反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的信息放典,并且可以操作類或?qū)ο蟮膬?nèi)部屬性逝变。
Oracle官方對(duì)反射的解釋是
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.
簡(jiǎn)而言之,通過反射奋构,我們可以在運(yùn)行時(shí)獲得程序或程序集中每一個(gè)類型的成員和成員的信息。
程序中一般的對(duì)象的類型都是在編譯期就確定下來的弥臼,而Java反射機(jī)制可以動(dòng)態(tài)地創(chuàng)建對(duì)象并調(diào)用其屬性,這樣的對(duì)象的類型在編譯期是未知的径缅。所以我們可以通過反射機(jī)制直接創(chuàng)建對(duì)象掺栅,即使這個(gè)對(duì)象的類型在編譯期是未知的烙肺。
反射的核心是JVM在運(yùn)行時(shí)才動(dòng)態(tài)加載類或調(diào)用方法/訪問屬性,它不需要事先(寫代碼的時(shí)候或編譯期)知道運(yùn)行對(duì)象是誰氧卧。
Java反射框架主要提供以下功能:
1.在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
2.在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象搏明;
3.在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法);
4.在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
反射的主要用途
很多人都認(rèn)為反射在實(shí)際的Java開發(fā)應(yīng)用中并不廣泛星著,其實(shí)不然粗悯。
當(dāng)我們?cè)谑褂肐DE(如Eclipse,IDEA)時(shí)为黎,當(dāng)我們輸入一個(gè)對(duì)象或類并想調(diào)用它的屬性或方法時(shí)行您,一按點(diǎn)號(hào),編譯器就會(huì)自動(dòng)列出它的屬性或方法娃循,這里就會(huì)用到反射。
反射最重要的用途就是開發(fā)各種通用框架笛质。
很多框架(比如Spring)都是配置化的(比如通過XML文件配置JavaBean,Action之類的)捞蚂,為了保證框架的通用性妇押,它們可能需要根據(jù)配置文件加載不同的對(duì)象或類姓迅,調(diào)用不同的方法,這個(gè)時(shí)候就必須用到反射——運(yùn)行時(shí)動(dòng)態(tài)加載需要加載的對(duì)象肩杈。
舉一個(gè)例子解寝,在運(yùn)用Struts 2框架的開發(fā)中我們一般會(huì)在struts.xml里去配置Action,比如:
<action name="login"
class="org.ScZyhSoft.test.action.SimpleLoginAction"
method="execute">
<result>/shop/shop-index.jsp</result>
<result name="error">login.jsp</result>
</action>
配置文件與Action建立了一種映射關(guān)系聋伦,當(dāng)View層發(fā)出請(qǐng)求時(shí)界睁,請(qǐng)求會(huì)被StrutsPrepareAndExecuteFilter攔截兵拢,然后StrutsPrepareAndExecuteFilter會(huì)去動(dòng)態(tài)地創(chuàng)建Action實(shí)例。
比如我們請(qǐng)求login.action卵佛,那么StrutsPrepareAndExecuteFilter就會(huì)去解析struts.xml文件,檢索action中name為login的Action疾牲,并根據(jù)class屬性創(chuàng)建SimpleLoginAction實(shí)例衙解,并用invoke方法來調(diào)用execute方法,這個(gè)過程離不開反射蚓峦。
對(duì)與框架開發(fā)人員來說,反射雖小但作用非常大暑椰,它是各種容器實(shí)現(xiàn)的核心。而對(duì)于一般的開發(fā)者來說避消,不深入框架開發(fā)則用反射用的就會(huì)少一點(diǎn)召夹,不過了解一下框架的底層機(jī)制有助于豐富自己的編程思想,也是很有益的监憎。
反射的基本運(yùn)用