Java 創(chuàng)建對(duì)象方式:
● 用new語(yǔ)句創(chuàng)建對(duì)象
● 運(yùn)用反射手段,調(diào)用java.lang.Class 或者 java.lang.reflect.Constructor 類的newInstance()實(shí)例方法
● 調(diào)用對(duì)象的clone()方法
● 運(yùn)用序列化手段,調(diào)用java.io.ObjectInputStream 對(duì)象的 readObject()方法.
分別創(chuàng)建100萬(wàn)個(gè)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
另外測(cè)試了Field 和 Method 執(zhí)行效率:
//method : 1406
//feild : 1360 getField("")得到實(shí)例和父類的“公共”屬性
//getDeclaredField() 得到實(shí)例的指定屬性(Public,protected,dfault,pivate),不包括父類屬性
//getFields()返回field數(shù)組, 得到實(shí)例 和 父類 的所有 “公共”屬性
動(dòng)態(tài)代理:
JDK:jdk1.7.0_02
CGLIB:和spring2.0.6 使用同樣的cglib-nodep-2.1_3.jar
CPU:P8400 2.53GHz 2.53GHz
測(cè)試結(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
CGLIB創(chuàng)建代理對(duì)象速度大概比JDK Proxy慢3倍,執(zhí)行速度是JDK Proxy的3倍以上區(qū)別:
如果一個(gè)目標(biāo)對(duì)象如果實(shí)現(xiàn)了接口Spring則會(huì)選擇JDK動(dòng)態(tài)代理策略動(dòng)態(tài)的創(chuàng)建一個(gè)接口實(shí)現(xiàn)類(動(dòng)態(tài)代理類)來(lái)代理目標(biāo)對(duì)象,可以通俗的理解這個(gè)動(dòng)態(tài)代理類是目標(biāo)對(duì)象的另外一個(gè)版本,所以這兩者之間在強(qiáng)制轉(zhuǎn)換的時(shí)候會(huì)拋出java.lang.ClassCastException。而所以在默認(rèn)情況下,如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,Spring會(huì)選擇CGLIB代理, 其生成的動(dòng)態(tài)代理對(duì)象是目標(biāo)類的子類。spring 配置實(shí)用cglib動(dòng)態(tài)代理
proxy-target-class 屬性設(shè)為true 或 <aop:aspectj-autoproxy proxy-target-class="true"/>