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