對反射的理解

       在做項目時,需要實現這樣一個需求:在前臺jsp頁面中,知道javabean的屬性名(該值被存到了數據庫中),也知道javabean本對象,想獲取該屬性的值,怎麼實現呢?當時想這不是需要動態的獲取類的方法嗎?於是想到了反射機制的概念:在運行狀態中,對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。Java反射機制有這樣一個功能:在運行時調用任意一個對象的方法;生成動態代理。這正好符合我的需求。以下把項目中的關鍵代碼貼出來,供大家理解反射機制在項目中的應用:

        javabean:

091353345.jpg

        前臺jsp頁面

111840572.jpg

      其中上述用紅線框框起來的就是java反射思想的核心代碼:首先根據屬性名,先組合方法名(methodname),然後創建Method對象,引用JDKAPI中對該類的描述是:Method 提供關於類或接口上單獨某個方法(以及如何訪問該方法)的信息,該類有個public Object invoke( Object obj ,  Object  args)方法,該方法是對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法,返回值就是指定對象的該方法的返回值,若該方法爲void類型方法,則範圍null,否則範圍object對象,最終需要強制轉換爲你所需要的類型。

       以下代碼是可以運行的測試類,其包含一個學生內部類:

import java.lang.reflect.Method;
public class Ceshi {
//內部類 學生類
public  static class Student{
public String stunum; //學號
public String stuname;//姓名
public String getStunum() {
return stunum;
}
public void setStunum(String stunum) {
this.stunum = stunum;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
}
public static void main(String args[]){
Student stu=new Student();
stu.setStuname("李志信");
stu.setStunum("2008111014");
try {
Method method=stu.getClass().getDeclaredMethod("getStuname", null);
String value=(String)method.invoke(stu, null);
System.out.println("學生姓名爲:"+value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

          

    運行結果爲:學生姓名爲:李志信;證明了我上述總結的是準確的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章