一. 基礎概念
Java中,一般我們創(chuàng)建一個對象可能會選擇new一下個實例。但是隨著我們技術的不斷提升,我們也學習到了,可以通過反射技術實現(xiàn)對象的創(chuàng)建。
可是,你有沒有想一下,什么時候我們改用new創(chuàng)建對象,什么時候我們改用反射創(chuàng)建對象呢?
兩者創(chuàng)建對象的效率又是如何呢?
//new方式創(chuàng)建對象 ReflectDemoreflectDemo=newReflectDemo(); //反射創(chuàng)建對象反射創(chuàng)建對象的三種方式 (1)ClassreflectDemoClass=ReflectDemo.class; (2)Class>aClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo"); (3)Class?extends?Class>aClass=reflectDemoClass.getClass();
二. new 對象和反射創(chuàng)建對象的效率對比
//測試代碼如下
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException{
proxyObject();
newObject();
}
//new創(chuàng)建對象
//5
publicstaticvoidnewObject(){
longstartTime=System.currentTimeMillis();
inti;
for(i=0;i100000000;?i++)?{
???ReflectDemo?reflectDemo?=?new?ReflectDemo?();
??}
??if?(i?==?100000000)?{
???long?endTime?=?System.currentTimeMillis?();
???System.out.println?("new耗時為:"?+?(endTime?-?startTime));
??}
?}
?//反射?創(chuàng)建對象
?//30
?public?static?void?proxyObject()?throws?IllegalAccessException,?InstantiationException?{
??long?startTime?=?System.currentTimeMillis?();
??ClassreflectDemoClass=ReflectDemo.class;
inti;
for(i=0;i100000000;?i++)?{
???ReflectDemo?reflectDemo?=?reflectDemoClass.newInstance?();
??}
??if?(i?==?100000000)?{
???long?endTime?=?System.currentTimeMillis?();
???System.out.println?("反射耗時為:"?+?(endTime?-?startTime));
??}
?}
}

最終我們發(fā)現(xiàn),new 100000000 個對象和反射創(chuàng)建 100000000 個對象,效率相差了很多倍。
所以下面我們來探討一下為什么這么大差別?
首先第一點,一般我們的Java代碼是需要編譯后在虛擬機里面運行的。
我們一般都是通過一個前端編輯器,比如javac,把java文件轉為class文件。
接下來,程序運行期間,可能會通過一個JIT,即時編譯器將字節(jié)碼文件轉換為計算機認識的機器碼文件。
另外一種可能是通過一個AOT編譯器,直接把java文件編譯為本地機器碼文件。其中JIT在程序運行期會對程序進行優(yōu)化,但是反射是通過動態(tài)解析的方式,因此可能無法執(zhí)行某些java虛擬機的優(yōu)化。
總結起來有下面幾個原因:
Method#invoke 方法會對參數(shù)做封裝和解封操作
需要檢查方法可見
需要校驗參數(shù)
反射方法難以內(nèi)聯(lián)
JIT 無法優(yōu)化
三. 反射和new 的使用場景
反射的部分使用場景
Spring通過反射來幫我們實例化對象,并放入到Ioc容器中
使用JDBC鏈接數(shù)據(jù)庫時加載數(shù)據(jù)庫驅動Class.forName()
逆向代碼 例如反編譯
利用反射,在泛型為int的arryaList集合中存放一個String類型的對象
new 對象和反射的區(qū)別
new的對象無法訪問其中的私有屬性,反射出來的可以通過設置setAccessible()方法來省略訪問權限符。
new必須要知道類名,而反射創(chuàng)建對象不需要知道類型也可以創(chuàng)建
-
JAVA
+關注
關注
20文章
2992瀏覽量
115252 -
編輯器
+關注
關注
1文章
825瀏覽量
32555 -
反射技術
+關注
關注
0文章
5瀏覽量
6074
原文標題:Java反射和new效率對比,差距有多大?
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
如何用java映射創(chuàng)建java對象和調(diào)用java對象呢
如何用java映射創(chuàng)建java對象和調(diào)用java對象的方法
JAVA語言與面向對象程序設計課件
Java對象的生命周期
java如何創(chuàng)建對象的分析
java反射實例解析
實例分析Java中創(chuàng)建對象
Java反射機制到底是什么?有什么作用
詳解Java基礎知識點反射

Java反射技術實現(xiàn)對象的創(chuàng)建
評論