歡迎您光臨本站 註冊首頁

深入理解Java的內省與反射

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  很多朋友在深入的接觸Java語言后就會發現這樣兩個詞:反射(Reflection)和內省(Introspector),經常搞不清楚這到底是怎麼回事,在什麼場合下應用以及如何使用?

  反射

  相對而言,反射比內省更容易理解一點.用一句比較白的話來概括,反射就是讓你可以通過名稱來得到對象(類,屬性,方法)的技術.例如我們可以通過類名來生成一個類的實例;知道了方法名,就可以調用這個方法;知道了屬性名就可以訪問這個屬性的值,還是寫兩個例子讓大家更直觀的了解反射的使用方法:


//通過類名來構造一個類的實例
ClassClasscls_str=Class.forName("java.lang.String");
//上面這句很眼熟,因為使用過JDBC訪問資料庫的人都用過J
Objectstr=cls_str.newInstance();
//相當於Stringstr=newString();

//通過方法名來調用一個方法
StringmethodName="length";
Methodm=cls_str.getMethod(methodName,null);
System.out.println("lengthis" m.invoke(str,null));
//相當於System.out.println(str.length());

  上面的兩個例子是比較常用方法.看到上面的例子就有人要發問了:為什麼要這麼麻煩呢?本來一條語句就完成的事情幹嗎要整這麼複雜?沒錯,在上面的例子中確實沒有必要這麼麻煩.不過你想像這樣一個應用程序,它支持動態的功能擴展,也就是說程序不重新啟動但是可以自動載入新的功能,這個功能使用一個具體類來表示.我們必須為這些功能定義一個介面類,然後我們要求所有擴展的功能類必須實現我指定的介面,這個規定了應用程序和可擴展功能之間的介面規則,但是怎麼動態載入呢?我們必須讓應用程序知道要擴展的功能類的類名,比如是test.Func1,當我們把這個類名(字元串)告訴應用程序后,它就可以使用我們第一個例子的方法來載入並啟用新的功能.這就是類的反射,請問你有別的選擇嗎?

  內省

  內省是Java語言對Bean類屬性、事件的一種預設處理方法.例如類A中有屬性name,那我們可以通過getName,setName來得到其值或者設置新的值.通過getName/setName來訪問name屬性,這就是默認的規則.Java中提供了一套API用來訪問某個屬性的getter/setter方法,通過這些API可以使你不需要了解這個規則,這些API存放於包java.beans中.

  一般的做法是通過類Introspector來獲取某個對象的BeanInfo信息,然後通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應的getter/setter方法,然後我們就可以通過反射機制來調用這些方法.下面我們來看一個例子,這個例子把某個對象的所有屬性名稱和值都列印出來:


/*
*Createdon2004-6-29
*/

packagedemo;

importjava.beans.BeanInfo;
importjava.beans.Introspector;
importjava.beans.PropertyDescriptor;

publicclassIntrospectorDemo{
Stringname;
publicstaticvoidmain(String[]args)throwsException{
IntrospectorDemodemo=newIntrospectorDemo();
demo.setName("WinterLau");

//如果不想把父類的屬性也列出來的話,
//那getBeanInfo的第二個參數填寫父類的信息
BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);
PropertyDescriptor[]props=bi.getPropertyDescriptors();
for(inti=0;i<props.length;i ){
System.out.println(props[i].getName() "="
props[i].getReadMethod().invoke(demo,null));
}

}

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
this.name=name;
}
}


[火星人 ] 深入理解Java的內省與反射已經有751次圍觀

http://coctec.com/docs/java/show-post-60433.html