0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java反射和new效率對(duì)比,差距有多大?

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2022-12-22 14:50 ? 次閱讀

  • 一. 基礎(chǔ)概念
  • 二. new 對(duì)象和反射創(chuàng)建對(duì)象的效率對(duì)比
  • 三. 反射和new 的使用場(chǎng)景
cfc70a16-81b9-11ed-8abf-dac502259ad0.png

一. 基礎(chǔ)概念

Java中,一般我們創(chuàng)建一個(gè)對(duì)象可能會(huì)選擇new一下個(gè)實(shí)例。但是隨著我們技術(shù)的不斷提升,我們也學(xué)習(xí)到了,可以通過(guò)反射技術(shù)實(shí)現(xiàn)對(duì)象的創(chuàng)建。

可是,你有沒(méi)有想一下,什么時(shí)候我們改用new創(chuàng)建對(duì)象,什么時(shí)候我們改用反射創(chuàng)建對(duì)象呢?

兩者創(chuàng)建對(duì)象的效率又是如何呢?

//new方式創(chuàng)建對(duì)象
ReflectDemoreflectDemo=newReflectDemo();
//反射創(chuàng)建對(duì)象反射創(chuàng)建對(duì)象的三種方式
(1)ClassreflectDemoClass=ReflectDemo.class;
(2)ClassaClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)ClassaClass=reflectDemoClass.getClass();

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

二. new 對(duì)象和反射創(chuàng)建對(duì)象的效率對(duì)比

//測(cè)試代碼如下
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException{
proxyObject();
newObject();
}

//new創(chuàng)建對(duì)象
//5
publicstaticvoidnewObject(){
longstartTime=System.currentTimeMillis();
inti;
for(i=0;i100000000;i++){
ReflectDemoreflectDemo=newReflectDemo();
}
if(i==100000000){
longendTime=System.currentTimeMillis();
System.out.println("new耗時(shí)為:"+(endTime-startTime));
}
}

//反射創(chuàng)建對(duì)象
//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("反射耗時(shí)為:"+(endTime-startTime));
}
}
}
cfd737d8-81b9-11ed-8abf-dac502259ad0.png

最終我們發(fā)現(xiàn),new 100000000 個(gè)對(duì)象和反射創(chuàng)建 100000000 個(gè)對(duì)象,效率相差了很多倍。

所以下面我們來(lái)探討一下為什么這么大差別?

首先第一點(diǎn),一般我們的Java代碼是需要編譯后在虛擬機(jī)里面運(yùn)行的。

我們一般都是通過(guò)一個(gè)前端編輯器,比如javac,把java文件轉(zhuǎn)為class文件。

接下來(lái),程序運(yùn)行期間,可能會(huì)通過(guò)一個(gè)JIT,即時(shí)編譯器將字節(jié)碼文件轉(zhuǎn)換為計(jì)算機(jī)認(rèn)識(shí)的機(jī)器碼文件。

另外一種可能是通過(guò)一個(gè)AOT編譯器,直接把java文件編譯為本地機(jī)器碼文件。其中JIT在程序運(yùn)行期會(huì)對(duì)程序進(jìn)行優(yōu)化,但是反射是通過(guò)動(dòng)態(tài)解析的方式,因此可能無(wú)法執(zhí)行某些java虛擬機(jī)的優(yōu)化。

總結(jié)起來(lái)有下面幾個(gè)原因:

Method#invoke 方法會(huì)對(duì)參數(shù)做封裝和解封操作

  • 需要檢查方法可見(jiàn)
  • 需要校驗(yàn)參數(shù)
  • 反射方法難以內(nèi)聯(lián)
  • JIT 無(wú)法優(yōu)化

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

三. 反射和new 的使用場(chǎng)景

反射的部分使用場(chǎng)景

  1. Spring通過(guò)反射來(lái)幫我們實(shí)例化對(duì)象,并放入到Ioc容器中
  2. 使用JDBC鏈接數(shù)據(jù)庫(kù)時(shí)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)Class.forName()
  3. 逆向代碼 例如反編譯
  4. 利用反射,在泛型為int的arryaList集合中存放一個(gè)String類型的對(duì)象

new 對(duì)象和反射的區(qū)別

  1. new的對(duì)象無(wú)法訪問(wèn)其中的私有屬性,反射出來(lái)的可以通過(guò)設(shè)置setAccessible()方法來(lái)省略訪問(wèn)權(quán)限符。
  2. new必須要知道類名,而反射創(chuàng)建對(duì)象不需要知道類型也可以創(chuàng)建

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2947

    瀏覽量

    104373
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3739

    瀏覽量

    64174
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1608

    瀏覽量

    48979

原文標(biāo)題:Java反射和new效率對(duì)比,差距有多大?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    不按INTEL的“3W-2S”規(guī)則設(shè)計(jì),出問(wèn)題的概率多大?

    case,分別是“2W-2S”和“4W-2S”,Chris想仿真驗(yàn)證下不按intel要求的“3W-2S”設(shè)計(jì)的話,其他兩種case的性能差距多大! 唰的一聲,仿真的結(jié)果就出來(lái)了。那按照慣例還是先看無(wú)
    發(fā)表于 08-26 14:51

    華納云:java web和java什么區(qū)別java web和java什么區(qū)別

    Java Web和Java是兩個(gè)不同的概念,它們?cè)诠δ堋⒂猛竞蛯?shí)現(xiàn)方式上存在一些區(qū)別,下面將詳細(xì)介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語(yǔ)言,它提供了一種用于開(kāi)發(fā)各種應(yīng)用程序
    的頭像 發(fā)表于 07-16 13:35 ?514次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b><b class='flag-5'>有</b>什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b><b class='flag-5'>有</b>什么區(qū)別

    三星顯示CEO:中韓OLED顯示器企業(yè)技術(shù)差距僅1年

    三星Display社長(zhǎng)崔周善表示:“與中國(guó)顯示器企業(yè)的技術(shù)差距縮小到1年或1年半。為了維持技術(shù)超差距,必要聚集人才,提高研發(fā)的效率?!?/div>
    的頭像 發(fā)表于 03-08 14:54 ?967次閱讀

    關(guān)于2023年Java趨勢(shì)的內(nèi)容

    Java 17+ 被重新歸類為 Java 17,仍處于 早期采用者 階段,因?yàn)?b class='flag-5'>有更多的框架將 Java 17 作為基線。Java 21 已被
    的頭像 發(fā)表于 12-13 11:17 ?410次閱讀
    關(guān)于2023年<b class='flag-5'>Java</b>趨勢(shì)的內(nèi)容

    java環(huán)境配置成功后怎么運(yùn)行

    命令編譯Java源文件,生成字節(jié)碼文件(.class后綴); 使用java命令運(yùn)行生成的字節(jié)碼文件。 例如,我們
    的頭像 發(fā)表于 12-06 15:57 ?1702次閱讀

    idea怎么創(chuàng)建Java項(xiàng)目

    (Integrated Development Environment)是開(kāi)發(fā)Java項(xiàng)目的必備工具。常見(jiàn)的Java IDEEclipse、IntelliJ IDEA和NetBea
    的頭像 發(fā)表于 12-06 14:09 ?818次閱讀

    eclipse怎么運(yùn)行java項(xiàng)目

    : a. 打開(kāi)Eclipse,并選擇“File” > “New” > “Java Project”。 b. 輸入項(xiàng)目名稱,并選擇所需的構(gòu)建路徑和庫(kù)。 c. 單擊“Finish”按鈕以創(chuàng)建項(xiàng)目。 將Java
    的頭像 發(fā)表于 12-06 11:25 ?1867次閱讀

    byte屬于java基本類型嗎

    是的,byte屬于Java的基本數(shù)據(jù)類型之一。Java中共有8種基本數(shù)據(jù)類型,分別是byte、short、int、long、float、double、char和boolean。byte類型用于表示8
    的頭像 發(fā)表于 12-05 10:40 ?756次閱讀

    java怎么限制輸入數(shù)字的范圍

    Java中,你可以使用循環(huán)和條件語(yǔ)句來(lái)限制輸入數(shù)字的范圍。下面我將詳細(xì)介紹如何實(shí)現(xiàn)這一功能。 首先,你需要使用Java的輸入輸出庫(kù)來(lái)接收用戶的輸入。Java中提供了Scanner類來(lái)讀取控制臺(tái)輸入
    的頭像 發(fā)表于 11-30 16:07 ?1357次閱讀

    簡(jiǎn)單了解Java的新特性

    Java 8 到 Java 20,Java 已經(jīng)走過(guò)了漫長(zhǎng)的道路,自 Java 8 以來(lái),Java 生態(tài)系統(tǒng)發(fā)生了很多變化。最顯著的變化是
    的頭像 發(fā)表于 11-23 16:38 ?987次閱讀
    簡(jiǎn)單了解<b class='flag-5'>Java</b>的新特性

    java中常用的包哪些

    Java是一種面向?qū)ο蟮母呒?jí)編程語(yǔ)言,它具有平臺(tái)無(wú)關(guān)性和可擴(kuò)展性。Java中有很多常用的包,這些包提供了豐富的類庫(kù)和工具,用于開(kāi)發(fā)各種類型的應(yīng)用程序。下面是Java中一些常用的包
    的頭像 發(fā)表于 11-22 15:10 ?1215次閱讀

    java如何清空obj文件內(nèi)容

    清空一個(gè)文件的內(nèi)容可以通過(guò)以下步驟來(lái)完成。 首先,你需要指定要清空的文件的路徑。你可以使用Java的File類來(lái)操作文件。以下是一個(gè)使用File類的例子: File file = new File
    的頭像 發(fā)表于 11-21 10:29 ?417次閱讀

    javaweb和java什么區(qū)別

    Javaweb和Java是兩個(gè)不同的概念,它們之間存在明顯的區(qū)別。下面將詳細(xì)介紹這兩者的區(qū)別,以滿足你關(guān)于詳盡、詳實(shí)、細(xì)致的要求。 Java是一種廣泛應(yīng)用的編程語(yǔ)言和計(jì)算平臺(tái),它具有跨平臺(tái)性、面向
    的頭像 發(fā)表于 11-16 10:49 ?3228次閱讀

    new和malloc的區(qū)別

    1. 申請(qǐng)的內(nèi)存所在位置 new操作符從自由存儲(chǔ)區(qū)(free store)上為對(duì)象動(dòng)態(tài)分配內(nèi)存空間,而malloc函數(shù)從堆上動(dòng)態(tài)分配內(nèi)存。自由存儲(chǔ)區(qū)是C++基于new操作符的一個(gè)抽象概念,凡是通過(guò)
    的頭像 發(fā)表于 11-11 11:29 ?516次閱讀
    <b class='flag-5'>new</b>和malloc的區(qū)別

    通孔和盲孔對(duì)信號(hào)的差異影響多大?應(yīng)用的原則是什么?

    通孔和盲孔對(duì)信號(hào)的差異影響多大?應(yīng)用的原則是什么? 在PCB設(shè)計(jì)中,通孔和盲孔的應(yīng)用都極為廣泛。然而兩者在傳輸信號(hào)時(shí),存在著一定的差異。那么通孔和盲孔之間到底哪些不同之處?它們對(duì)信號(hào)的傳輸會(huì)有
    的頭像 發(fā)表于 10-31 14:34 ?1279次閱讀