<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3036字,需瀏覽 7分鐘

           ·

          2022-11-03 23:44

          點(diǎn)擊關(guān)注上方“Stephen”,

          設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨

          一. 基礎(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ì)象
          ReflectDemo reflectDemo = new ReflectDemo();
          //反射創(chuàng)建對(duì)象  反射創(chuàng)建對(duì)象的三種方式
          (1)Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
          (2)Class<?> aClass = Class.forName ("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
          (3)Class<? extends Class> aClass = reflectDemoClass.getClass ();

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

          //測(cè)試代碼如下
          public class ReflectDemo {
           public static void main (String[] args) throws IllegalAccessException, InstantiationException {
            proxyObject();
            newObject();
           }

           //new 創(chuàng)建對(duì)象
           //5
           public static void newObject(){
            long startTime = System.currentTimeMillis ();
            int i;
            for (i = 0; i < 100000000; i++) {
             ReflectDemo reflectDemo = new ReflectDemo ();
            }
            if (i == 100000000) {
             long endTime = System.currentTimeMillis ();
             System.out.println ("new耗時(shí)為:" + (endTime - startTime));
            }
           }

           //反射 創(chuàng)建對(duì)象
           //30
           public static void proxyObject() throws IllegalAccessException, InstantiationException {
            long startTime = System.currentTimeMillis ();
            Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
            int i;
            for (i = 0; i < 100000000; i++) {
             ReflectDemo reflectDemo = reflectDemoClass.newInstance ();
            }
            if (i == 100000000) {
             long endTime = System.currentTimeMillis ();
             System.out.println ("反射耗時(shí)為:" + (endTime - startTime));
            }
           }
          }

          最終我們發(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ù)
          • 反射方法難以?xún)?nèi)聯(lián)
          • JIT 無(wú)法優(yōu)化

          三. 反射和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類(lèi)型的對(duì)象

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

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

          感謝閱讀,希望對(duì)你有所幫助 :) 

          來(lái)源:blog.csdn.net/sunny_json/article/details/113047372

          END


          關(guān)注 Stephen,一起學(xué)習(xí),一起成長(zhǎng)。


          點(diǎn)“在看”支持下吧


          點(diǎn) 閱讀原文 可優(yōu)惠充值話費(fèi),流量,視頻會(huì)員等。

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费欧美性爱视频 | 免费的A片 | 色站综合 | 日本免费三级黄色电影网站 | 午夜精品一区二区三区在线视频99 |