Java 創(chuàng)建對象方式:
分別創(chuàng)建100萬個javaBean ,性能如下:
另外測試了Field 和 Method 執(zhí)行效率:
● 用new語句創(chuàng)建對象
● 運用反射手段,調(diào)用java.lang.Class 或者 java.lang.reflect.Constructor 類的newInstance()實例方法
● 調(diào)用對象的clone()方法
● 運用序列化手段,調(diào)用java.io.ObjectInputStream 對象的 readObject()方法.
分別創(chuàng)建100萬個javaBean ,性能如下:
//new : 46,47,47,62,47
//clone : 171,188,172,,157,172
//getClass().newInstance() : 140,141,141,,157,172
//Class.forName and newInstance : 1765,1781,1813,1797,1781
//Proxy.newProxyInstance : 2984
//Serializable : 60422
另外測試了Field 和 Method 執(zhí)行效率:
//method : 1406
//feild : 1360 getField("")得到實例和父類的“公共”屬性
//getDeclaredField() 得到實例的指定屬性(Public,protected,dfault,pivate),不包括父類屬性
//getFields()返回field數(shù)組, 得到實例 和 父類 的所有 “公共”屬性
動態(tài)代理:
區(qū)別:
如果一個目標(biāo)對象如果實現(xiàn)了接口Spring則會選擇JDK動態(tài)代理策略動態(tài)的創(chuàng)建一個接口實現(xiàn)類(動態(tài)代理類)來代理目標(biāo)對象,可以通俗的理解這個動態(tài)代理類是目標(biāo)對象的另外一個版本,所以這兩者之間在強制轉(zhuǎn)換的時候會拋出java.lang.ClassCastException。而所以在默認情況下,如果目標(biāo)對象沒有實現(xiàn)任何接口,Spring會選擇CGLIB代理, 其生成的動態(tài)代理對象是目標(biāo)類的子類。
spring 配置實用cglib動態(tài)代理
proxy-target-class 屬性設(shè)為true 或 <aop:aspectj-autoproxy proxy-target-class="true"/>
動態(tài)代理:
JDK:jdk1.7.0_02CGLIB創(chuàng)建代理對象速度大概比JDK Proxy慢3倍,執(zhí)行速度是JDK Proxy的3倍以上
CGLIB:和spring2.0.6 使用同樣的cglib-nodep-2.1_3.jar
CPU:P8400 2.53GHz 2.53GHz
測試結(jié)果4:Create JDK Proxy: 43 ms
Create CGLIB Proxy: 129 ms
Run JDK Proxy: 940 ms, 1,500,069 t/s
Run CGLIB Proxy: 299 ms, 4,715,937 t/s
區(qū)別:
如果一個目標(biāo)對象如果實現(xiàn)了接口Spring則會選擇JDK動態(tài)代理策略動態(tài)的創(chuàng)建一個接口實現(xiàn)類(動態(tài)代理類)來代理目標(biāo)對象,可以通俗的理解這個動態(tài)代理類是目標(biāo)對象的另外一個版本,所以這兩者之間在強制轉(zhuǎn)換的時候會拋出java.lang.ClassCastException。而所以在默認情況下,如果目標(biāo)對象沒有實現(xiàn)任何接口,Spring會選擇CGLIB代理, 其生成的動態(tài)代理對象是目標(biāo)類的子類。
spring 配置實用cglib動態(tài)代理
proxy-target-class 屬性設(shè)為true 或 <aop:aspectj-autoproxy proxy-target-class="true"/>