- 一. 基礎概念
- 二. new 對象和反射創建對象的效率對比
- 三. 反射和new 的使用場景

一. 基礎概念
Java中,一般我們創建一個對象可能會選擇new一下個實例。但是隨著我們技術的不斷提升,我們也學習到了,可以通過反射技術實現對象的創建。
可是,你有沒有想一下,什么時候我們改用new創建對象,什么時候我們改用反射創建對象呢?
兩者創建對象的效率又是如何呢?
//new方式創建對象
ReflectDemoreflectDemo=newReflectDemo();
//反射創建對象反射創建對象的三種方式
(1)ClassreflectDemoClass=ReflectDemo.class;
(2)Class>aClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)Class?extends?Class>aClass=reflectDemoClass.getClass();
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
二. new 對象和反射創建對象的效率對比
//測試代碼如下
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException{
proxyObject();
newObject();
}
//new創建對象
//5
publicstaticvoidnewObject(){
longstartTime=System.currentTimeMillis();
inti;
for(i=0;i100000000;i++){
ReflectDemoreflectDemo=newReflectDemo();
}
if(i==100000000){
longendTime=System.currentTimeMillis();
System.out.println("new耗時為:"+(endTime-startTime));
}
}
//反射創建對象
//30
publicstaticvoidproxyObject()throwsIllegalAccessException,InstantiationException{
longstartTime=System.currentTimeMillis();
ClassreflectDemoClass=ReflectDemo.class;
inti;
for(i=0;i100000000;i++){
ReflectDemoreflectDemo=reflectDemoClass.newInstance();
}
if(i==100000000){
longendTime=System.currentTimeMillis();
System.out.println("反射耗時為:"+(endTime-startTime));
}
}
}

最終我們發現,new 100000000 個對象和反射創建 100000000 個對象,效率相差了很多倍。
所以下面我們來探討一下為什么這么大差別?
首先第一點,一般我們的Java代碼是需要編譯后在虛擬機里面運行的。
我們一般都是通過一個前端編輯器,比如javac,把java文件轉為class文件。
接下來,程序運行期間,可能會通過一個JIT,即時編譯器將字節碼文件轉換為計算機認識的機器碼文件。
另外一種可能是通過一個AOT編譯器,直接把java文件編譯為本地機器碼文件。其中JIT在程序運行期會對程序進行優化,但是反射是通過動態解析的方式,因此可能無法執行某些java虛擬機的優化。
總結起來有下面幾個原因:
Method#invoke 方法會對參數做封裝和解封操作
- 需要檢查方法可見
- 需要校驗參數
- 反射方法難以內聯
- JIT 無法優化
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/yudao-cloud
- 視頻教程:https://doc.iocoder.cn/video/
三. 反射和new 的使用場景
反射的部分使用場景
- Spring通過反射來幫我們實例化對象,并放入到Ioc容器中
-
使用JDBC鏈接數據庫時加載數據庫驅動
Class.forName() - 逆向代碼 例如反編譯
- 利用反射,在泛型為int的arryaList集合中存放一個String類型的對象
new 對象和反射的區別
-
new的對象無法訪問其中的私有屬性,反射出來的可以通過設置
setAccessible()方法來省略訪問權限符。 - new必須要知道類名,而反射創建對象不需要知道類型也可以創建
審核編輯 :李倩
-
JAVA
+關注
關注
20文章
3001瀏覽量
116420 -
數據庫
+關注
關注
7文章
4019瀏覽量
68337 -
編譯器
+關注
關注
1文章
1672瀏覽量
51593
原文標題:Java反射和new效率對比,差距有多大?
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
RK3576 能否替代 RK3588?一文看懂 6TOPS 工業 AI SoC 的真實性能差距與選型邏輯
DRAM緩存真有那么重要嗎?天碩工業級SSD固態硬盤實測告訴你答案!
電池分容柜:“卷”出新高度,效率差距究竟有多大呢
HMC252A非反射式射頻開關
同是電流檢測芯片FP137 與 INA139,實際性能差距有多大?
Arm Neoverse CPU上大代碼量Java應用的性能測試
反射系數、回波損耗、電壓駐波比之間的關系
橢偏儀選型指南 | 橢圓偏振法與反射法的優劣對比
Java效率提升指南:5個Java工具選型建議及Perforce JRebel和XRebel介紹
0.04% vs 0.1%:精度差一點,逆變器性能差距有多大?
LED芯片電極中的鋁反射層被含氯膠水腐蝕現象觸目驚心!
超聲波除油清洗設備的清洗范圍有多大?
Java開發者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發者在用?
Java反射和new效率對比,差距有多大?
評論