關於在Java使用反射對屬性取值和賦值的效能問題。

2021-06-23 05:59:08 字數 3131 閱讀 8080

最近在使用因為受不了hibernate的各種問題,自己用jdbc在做乙個簡單的orm框架 。既然涉及到orm框架,肯定少不了使用反射對bean進行賦值。

我最初是參考struts2的ioc,使用set***和get***進行賦值取值。但是後來發現,直接對屬性賦值的效能更加好。

下面賦上我的測試**,我對每行關鍵**做了時間記錄,以便清楚地看出哪些**效能損耗高:

開啟accessible,對屬性賦值:

/**

* 直接開啟accessible,對屬性進行賦值

* @throws exception

*/@test

public void testfieldset() throws exception

long end = system.currenttimemillis();

system.out.println("直接開啟accessible,對屬性進行賦值,耗時:");

system.out.println("idfield.setaccessible(true):" + a);

system.out.println("idfield.set(obj, 1l):" + b);

system.out.println("idfield.setaccessible(false):" + c);

system.out.println("整個耗時:" + (end - start));

}

用set方法賦值:

/**

* 使用set方法賦值

* @throws exception

*/@test

public void testmethodset() throws exception

long end = system.currenttimemillis();

system.out.println("使用set方法賦值,耗時:");

system.out.println("string thesetmethodname = classutils.tosetmethodname(idfield.getname()):" + a);

system.out.println("method thesetmethod = clazz.getmethod(thesetmethodname, idfield.gettype()):" + b);

system.out.println("thesetmethod.invoke(obj, 1l):" + c);

system.out.println("整個耗時:" + (end - start));

}

********************=== 分割線*************************===

重複賦值10000000次的結果:

結果自己看。。就不解釋了。。

再來看看對屬性進行取值吧:

開啟accessible,對屬性取值:

/**

* 直接開啟accessible,對屬性進行取值

* @throws exception

*/@test

public void testfieldget() throws exception

long end = system.currenttimemillis();

system.out.println("直接開啟accessible,對屬性進行取值,耗時:");

system.out.println("idfield.setaccessible(true):" + a);

system.out.println("idfield.set(obj, 1l):" + b);

system.out.println("idfield.setaccessible(false):" + c);

system.out.println("整個耗時:" + (end - start));

}

用get方法進行賦值:

/**

* 使用get方法取值

* @throws exception

*/@test

public void testmethodget() throws exception

long end = system.currenttimemillis();

system.out.println("使用get方法取值,耗時:");

system.out.println("string thesetmethodname = classutils.tosetmethodname(idfield.getname()):" + a);

system.out.println("method thesetmethod = clazz.getmethod(thesetmethodname, idfield.gettype()):" + b);

system.out.println("thesetmethod.invoke(obj, 1l):" + c);

system.out.println("整個耗時:" + (end - start));

}

********************=== 分割線*************************===

重複取值10000000次的結果:

尼瑪。。我又不說話了。。自己看資料

********************=== 分割線*************************===

為什麼struts2的ioc,必須我們提供set方法呢? 研究過struts2原始碼的同學請回答...(我知道spring注入是不用提供的,不是鄙視struts2,只是求解而已。)

java反射遍歷實體類屬性和型別並取值賦值

取值的方法為 欄位.get 實體類 舉例 field 為實體類user中的乙個字段 field.get user 賦值的方法為 欄位.set 實體類 舉例 field 為實體類staff中的乙個字段 field.set staff 具體應用如下 user 為傳來的帶值的實體類 staff 為要賦值的...

java中使用反射獲取物件的屬性和屬性值

在控制器 的過程中,我們經常要將一些資料存到request中來進行引數傳遞,而我們通常將一些資料存到乙個實體物件裡面,這時就可以通過反射獲取物件裡面的屬性和屬性值,並用迴圈語句將該物件的屬性值存到request對應的key裡面。例如 field field paymentinfo.getclass ...

java 對類中的屬性使用set get方法的作用

經常看到有朋友提到類似 對類中的屬性使用set get方法的作用?理論的回答當然是封閉性之類的,但是這樣對我們有什麼作用呢?為什麼要這樣設計?我直接使用屬性名來訪問不是更直接,更簡潔明瞭嗎?下面我們就來介紹下為什麼要使用set get方法來代替直接訪問屬性。1.靈活性 比如我們有乙個person類,...