天天看點

java之反射機制(reflection)

什麼是反射?

在Java中的反射機制是指在運作狀态中,動态的擷取任意一個類所有的屬性和方法(包括方法簽名和方法傳回值等資訊),并且任意一個對象都能夠調用其任意一個方法。這種動态擷取資訊以及動态調用對象方法的功能成為Java語言的反射機制。

反射機制在什麼情況中使用?

1、由于java多态的存在,使得對象運作時的類型和聲明的類型不同,然而有些程式需要根據運作時的對象具體類型做出不同的處理,這時就需要用到反射機制了。例如在工廠模式中使用反射機制來建立子類。

2、反射最大的應用就是架構,可以用反射來動态填充屬性。例如:

-spring和javaBean中對屬性的填充

-JDBC 的 classForName()

反射機制如何使用?

1、java反射機制API

反射API用來生成JVM中的類、接口或則對象的資訊。

-Class類:反射的核心類,可以擷取類的屬性,方法等資訊。

-Field類:Java.lang.reflec包中的類,表示類的成員變量,可以用來擷取和設定類之中的屬性值。

-Method類:Java.lang.reflec包中的類,表示類的方法,它可以用來擷取類中的方法資訊或者執行方法。

-Constructor類: Java.lang.reflec包中的類,表示類的構造方法。

2、API使用

-擷取類型

class clazz=Person.class;
class clazz=class.forName("Person");
class clazz=person1.getClass();
           

-擷取類的屬性和方法

Method[] method=clazz.getDeclaredMethods();
Field[] field=clazz.getDeclaredFields();
           

-調用對象的方法

//利用反射機制調用Person類的setName方法給對象person設定name為Amy

Person person=new Person();
Method method=Person.class.getMethod("setName",String.class);
method.invoke(person,"Amy");
           

3、java.beans包

java.beans包實作以其屬性值的文本表示形式讀取或寫入 bean。這些屬性值被視為 bean,它們被遞歸地讀取或寫入,以捕獲其公共可用狀态。【百度百科】

Java提供了java.beans .PropertyEditor接口以及java.beans .PropertyEditorSupport,後者實作了前者,自定義類在繼承後者時隻需要擴充setAsText(String)方法,即可将這個String按照自己的意願解析成自定義的對象,生成對象後,調用setValue(Object)方法傳入,就寫到目前PropertyEditor對象的v就完成了對該Object的對應property(Feild)的指派操作。

反射機制的優缺點?

盡管反射非常強大,但也不能濫用。如果一個功能可以不用反射完成,那麼最好就不用。使用反射機制的原則:

性能第一

反射包括了一些動态類型,是以JVM無法對這些代碼進行優化。是以,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被執行的代碼或對性能要求很高的程式中使用反射。

安全限制

使用反射技術要求程式必須在一個沒有安全限制的環境中運作。如果一個程式必須在有安全限制的環境中運作,如Applet,那麼這就是個問題。

内部暴露

由于反射允許代碼執行一些在正常情況下不被允許的操作(比如通路私有的屬性和方法),是以使用反射可能會導緻意料之外的副作用——代碼有功能上的錯誤,降低可移植性。反射代碼破壞了抽象性,是以當平台發生改變的時候,代碼的功能也會随着變化。

參考:

【1】《java特種兵上》

【2】http://blog.csdn.net/u012721013/article/details/51833626

【3】http://blog.csdn.net/xu__cg/article/details/52882023