成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
Java中,一般我們創建一個對象可能會選擇new一下個實例。但是隨著我們技術的不斷提升,我們也學習到了,可以通過反射技術實現對象的創建。

一. 基礎概念

Java中,一般我們創建一個對象可能會選擇new一下個實例。但是隨著我們技術的不斷提升,我們也學習到了,可以通過反射技術實現對象的創建。

可是,你有沒有想一下,什么時候我們改用new創建對象,什么時候我們改用反射創建對象呢?

兩者創建對象的效率又是如何呢?

//new 方式創建對象
ReflectDemo reflectDemo = new ReflectDemo();
//反射創建對象  反射創建對象的三種方式
(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 對象和反射創建對象的效率對比

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

 //new 創建對象
 //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耗時為:" + (endTime - startTime));
  }
 }

 //反射 創建對象
 //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 ("反射耗時為:" + (endTime - startTime));
  }
 }
}


圖片圖片

最終我們發現,new 100000000 個對象和反射創建 100000000 個對象,效率相差了很多倍。

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

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

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

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

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

總結起來有下面幾個原因:

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

  • 需要檢查方法可見
  • 需要校驗參數
  • 反射方法難以內聯
  • JIT 無法優化

三. 反射和new 的使用場景

反射的部分使用場景

  1. Spring通過反射來幫我們實例化對象,并放入到Ioc容器中
  2. 使用JDBC鏈接數據庫時加載數據庫驅動Class.forName()
  3. 逆向代碼 例如反編譯
  4. 利用反射,在泛型為int的arryaList集合中存放一個String類型的對象

new 對象和反射的區別

  1. new的對象無法訪問其中的私有屬性,反射出來的可以通過設置setAccessible()方法來省略訪問權限符。
  2. new必須要知道類名,而反射創建對象不需要知道類型也可以創建
責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-04-17 09:31:41

2019-10-08 14:25:50

AndroidiOS安卓

2023-03-15 16:00:14

JavaJava new開發

2022-08-03 15:08:35

iOS系統蘋果

2020-04-02 09:24:08

國產操作系統差距

2012-02-13 10:40:18

網絡數據中心

2025-01-15 00:00:00

Java內省性能

2022-07-20 12:24:38

Python列表集合

2009-07-27 14:11:22

硅谷動力

2023-08-21 13:31:51

ERP物聯網

2023-05-16 11:12:54

人工智能AI

2012-03-31 13:55:15

Java

2020-02-24 11:37:56

Linux重定向管道

2023-07-05 12:28:36

芯片

2010-09-25 08:51:00

SNS網站Facebook人人網

2018-01-05 13:01:38

Python項目代碼

2012-08-28 09:40:13

OpenStack云操作系統

2018-03-13 14:55:08

2017-02-07 15:55:24

4G網速運營商

2009-06-21 13:36:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产a视频| 国产乱性 | 一区二区三区国产好的精 | 精品国产乱码久久久久久丨区2区 | 女女百合av大片一区二区三区九县 | 综合一区 | 日韩a视频 | 噜噜噜噜狠狠狠7777视频 | 日韩精品免费 | 国产一级免费视频 | 亚洲精品在线免费观看视频 | 午夜资源 | 秋霞在线一区 | 一区二区三区精品视频 | 日韩插插| 欧美婷婷| 国产清纯白嫩初高生视频在线观看 | 日日综合 | 在线观看黄视频 | 女人牲交视频一级毛片 | 欧美日韩亚洲视频 | 麻豆久久| 日韩精品一区二区三区视频播放 | 欧美性一级 | 欧美亚洲国产一区二区三区 | 日本淫视频| 一区二区视屏 | 91久久国产综合久久91精品网站 | 草久视频 | 欧洲尺码日本国产精品 | 天天躁日日躁狠狠的躁天龙影院 | 91国内视频在线 | 婷婷色在线播放 | 黄色片亚洲 | www.五月天婷婷.com | 国产精品日韩欧美一区二区三区 | 国产在线视频网 | 国产一卡二卡三卡 | 国产伦精品一区二区三毛 | 国产 欧美 日韩 一区 | 午夜精品一区二区三区免费视频 |