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

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

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

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

Android編程精選 ? 來源:Android編程精選 ? 2023-05-22 14:25 ? 次閱讀

一. 基礎(chǔ)概念

Java中,一般我們創(chuàng)建一個對象可能會選擇new一下個實例。但是隨著我們技術(shù)的不斷提升,我們也學(xué)習(xí)到了,可以通過反射技術(shù)實現(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)ClassaClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)ClassaClass=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;ireflectDemoClass=ReflectDemo.class;
inti;
for(i=0;i
6000b410-f771-11ed-90ce-dac502259ad0.png

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

所以下面我們來探討一下為什么這么大差別?

首先第一點,一般我們的Java代碼是需要編譯后在虛擬機里面運行的。

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

接下來,程序運行期間,可能會通過一個JIT,即時編譯器將字節(jié)碼文件轉(zhuǎn)換為計算機認識的機器碼文件。

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

總結(jié)起來有下面幾個原因:

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

需要檢查方法可見

需要校驗參數(shù)

反射方法難以內(nèi)聯(lián)

JIT 無法優(yōu)化

三. 反射和new 的使用場景

反射的部分使用場景

Spring通過反射來幫我們實例化對象,并放入到Ioc容器中

使用JDBC鏈接數(shù)據(jù)庫時加載數(shù)據(jù)庫驅(qū)動Class.forName()

逆向代碼 例如反編譯

利用反射,在泛型為int的arryaList集合中存放一個String類型的對象

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

new的對象無法訪問其中的私有屬性,反射出來的可以通過設(shè)置setAccessible()方法來省略訪問權(quán)限符。

new必須要知道類名,而反射創(chuàng)建對象不需要知道類型也可以創(chuàng)建

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

    關(guān)注

    19

    文章

    2982

    瀏覽量

    106111
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    811

    瀏覽量

    31490
  • 反射技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6012

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

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

    如何用java映射創(chuàng)建java對象和調(diào)用java對象

    java是一種解析語言,java程序是通過java虛擬機解析.class的方式運行起來。因此,java中就存在java映射的概念。下面介紹如
    發(fā)表于 04-11 14:43

    如何用java映射創(chuàng)建java對象和調(diào)用java對象的方法

    Method對象的invoke方法。好,現(xiàn)在上代碼:lolpackage com.bunchen.test;import java.lang.reflect.Constructor;import
    發(fā)表于 07-28 16:11

    JAVA語言與面向對象程序設(shè)計課件

    JAVA語言與面向對象程序設(shè)計課件:第1章  Java和面向對象概述.ppt第2章  Java概述.ppt第3章&nbs
    發(fā)表于 12-06 13:52 ?44次下載

    Java對象的生命周期

    本章內(nèi)容 4.1 對象的聲明與創(chuàng)建4.1.1 基本術(shù)語4.1.2 對象的聲明4.1.3 對象創(chuàng)建4.1.4 數(shù)組
    發(fā)表于 04-10 15:49 ?0次下載

    JAVA教程之存儲與讀取對象

    JAVA教程之存儲與讀取對象,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?7次下載

    基于Java反射機制的Excel文件導(dǎo)出實現(xiàn)_楊敏煜

    基于Java反射機制的Excel文件導(dǎo)出實現(xiàn)_楊敏煜
    發(fā)表于 03-18 09:46 ?1次下載

    java如何創(chuàng)建對象的分析

    作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但我們通常使用依賴管理系統(tǒng),比如Spring去創(chuàng)建對象。然而這里有很多
    發(fā)表于 09-27 14:36 ?0次下載

    java反射實例解析

    Class類的構(gòu)造方法是private,由JVM創(chuàng)建反射java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查并且對內(nèi)部的成員進行操作。例如它允許一個java
    發(fā)表于 09-27 15:40 ?0次下載

    實例分析Java創(chuàng)建對象

    Java中有5種創(chuàng)建對象的方式,下面給出它們的例子還有它們的字節(jié)碼 Paste_Image.png 如果你運行了末尾的的程序,你會發(fā)現(xiàn)方法1,2,3用構(gòu)造函數(shù)創(chuàng)建
    發(fā)表于 09-28 13:29 ?0次下載

    java學(xué)習(xí)——java中的反射學(xué)習(xí)筆記

    本文檔內(nèi)容介紹了java學(xué)習(xí)java中的反射學(xué)習(xí)筆記,供參考
    發(fā)表于 03-13 14:19 ?0次下載

    Java反射機制到底是什么?有什么作用

    Java反射機制是 Java 語言的一個重要特性,它在服務(wù)器程序和中間件程序中得到了廣泛運用。在服務(wù)器端,往往需要根據(jù)客戶的請求,動態(tài)調(diào)用某一個對象的特定方法。此外,在 ORM 中間件
    的頭像 發(fā)表于 02-15 14:07 ?4894次閱讀

    Java實驗:類和對象的擴展

    Java實驗:類和對象的擴展
    發(fā)表于 07-08 15:36 ?20次下載
    <b class='flag-5'>Java</b>實驗:類和<b class='flag-5'>對象</b>的擴展

    詳解Java基礎(chǔ)知識點反射

    Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為
    的頭像 發(fā)表于 04-09 13:47 ?2012次閱讀
    詳解<b class='flag-5'>Java</b>基礎(chǔ)知識點<b class='flag-5'>反射</b>

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

    Java中,一般我們創(chuàng)建一個對象可能會選擇new一下個實例。但是隨著我們技術(shù)的不斷提升,我們也學(xué)習(xí)到了,可以通過反射
    的頭像 發(fā)表于 12-22 14:50 ?1322次閱讀

    Java創(chuàng)建對象有哪些方式

    1 問題 作為Java開發(fā)者,經(jīng)常創(chuàng)建很多對象,你是否知道Java創(chuàng)建對象有哪些方式呢?
    的頭像 發(fā)表于 02-24 10:29 ?1158次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品