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

Java 反射 和 Java new 的效率有什么區別,親測相差100倍

開發 前端
在我們的日常使用中,Java new是用的最多的,但是有些框架往往會使用Java反射來實現靈活性,那么它們之間的效率有什么區別呢?

我們的日常使用中,Java new是用的最多的,但是有些框架往往會使用Java反射來實現靈活性,那么它們之間的效率有什么區別呢?

你有沒有想過,什么時候應該該用new來創建對象,什么時候該使用反射呢?

兩者之間創建對象的效率如何?

ReflectDemo reflectDemo = new ReflectDemo();
Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
Class<?> aClass = Class.forName ("com.jason.sample.ReflectDemo");
Class<? extends Class> aClass = reflectDemoClass.getClass ();

1. new 對象和反射創建對象的效率對比

public class ReflectDemo {
public static void main (String[] args) throws IllegalAccessException, InstantiationException {
proxyObject();
newObject();
}

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 time:" + (endTime - startTime));
}
}

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 ("reflection time:" + (endTime - startTime));
}
}
}

new time:3
reflection time:230

最后我們發現新建1億個對象和反射創建1億個對象的效率相差很多倍。

那么讓我們來探討一下為什么會有如此大的差異。

一般來說,我們的Java代碼需要在虛擬機上編譯運行。

一般通過前端編輯器將java文件轉換成class文件,比如javac.

接下來,在程序執行期間,JIT(即時編譯器)可以將字節碼文件轉換為計算機可識別的機器碼文件。另一種方式是通過 AOT 編譯器直接將 java 文件編譯成本地機器碼文件。其中JIT會在程序運行時對程序進行優化,但是反射是通過動態分析的,所以可能無法對Java虛擬機進行一些優化。

?總結起來有以下幾個原因:

  1. 反射需要動態解析類信息:在使用反射創建對象時,需要使用Class.forName()方法或類的class屬性等方式獲取類的信息。這個過程需要在運行時進行,而使用new關鍵字則在編譯時已經解析了類信息,所以不需要進行類信息解析。
  2. 反射需要查找并調用構造函數:使用反射創建對象需要先獲取構造函數對象,然后通過反射調用構造函數進行對象創建。這個過程需要在運行時進行,而使用new關鍵字則直接調用構造函數進行對象創建,無需查找構造函數。
  3. 反射需要進行安全性檢查:使用反射創建對象時,Java會對代碼進行安全性檢查,以確保反射調用的方法和構造函數是可訪問的。這個過程也需要在運行時進行,而使用new關鍵字則不需要進行安全性檢查。
  4. 反射創建的對象需要做額外的初始化工作:使用反射創建的對象需要進行額外的初始化工作,例如調用對象的setAccessible(true)方法以訪問私有成員變量和方法等。這些額外的操作也會增加反射創建對象的時間。

綜上所述,Java反射比使用new關鍵字創建對象的性能差,因為反射需要在運行時進行更多的操作,包括動態解析類信息、查找并調用構造函數、進行安全性檢查和進行額外的初始化工作等。在性能要求較高的場景中,應該盡可能地避免使用反射創建對象,而盡量使用new關鍵字進行對象創建。

2、反射的使用場景

反射的一些使用場景

  • 框架設計:Java反射可以在框架設計中使用,例如Spring框架中就廣泛地使用了反射技術,可以根據注解或配置文件動態地加載和實例化對象,而不需要手動創建對象。
  • 測試工具:Java反射可以用于編寫測試工具,例如JUnit框架就使用反射來執行測試方法,并獲取測試結果等信息。
  • 插件化:Java反射可以用于插件化開發,可以通過反射獲取插件中的類、方法、屬性等信息,從而實現插件化功能。
  • 動態代理:Java反射可以用于動態代理技術中,可以動態地生成代理類,并在代理類中調用被代理對象的方法,從而實現代理功能。
  • 序列化和反序列化:Java反射可以用于序列化和反序列化操作,例如在Jackson和Gson等JSON解析庫中就使用了反射技術,可以自動地將JSON字符串轉換為Java對象,或者將Java對象轉換為JSON字符串。
責任編輯:華軒 來源: 今日頭條
相關推薦

2025-05-26 04:00:00

Javanew效率

2022-08-31 08:33:54

Bash操作系統Linux

2024-05-27 00:40:00

2022-02-27 15:33:22

安全CASBSASE

2021-12-17 14:40:02

while(1)for(;;)語言

2021-05-16 14:26:08

RPAIPACIO

2024-03-05 18:59:59

前端開發localhost

2024-09-09 13:10:14

2022-08-02 08:23:37

SessionCookies

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-06-06 14:53:02

LoRaLoRaWAN

2020-11-09 14:07:53

PyQtQt編程

2018-07-20 14:00:51

LinuxmacOS內核

2023-12-15 09:21:17

ObjectJavaString

2025-03-10 09:30:00

SpringJava開發

2022-08-22 07:06:32

MyBatisSQL占位符

2024-02-20 08:45:13

雙大括號建立Java Map通用的模式

2021-09-10 17:02:43

Python協程goroutine
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美电影在线观看网站 | av资源网站 | 久久精品国产99国产精品 | 欧美中文字幕在线观看 | 日韩欧美精品一区 | 午夜久久久 | 亚av在线 | 久久男人 | 日本免费黄色一级片 | 精品久久久久一区 | 一区欧美 | 国产精品自在线 | 亚洲精品一区二区三区在线 | 亚洲另类春色偷拍在线观看 | 精产国产伦理一二三区 | 国产精品免费在线 | 蜜桃av人人夜夜澡人人爽 | 亚洲福利av| 中文字幕成人在线 | 天天躁天天操 | 天天操操| 精品在线一区二区 | 三级av在线 | 日韩国产在线 | 欧美视频三区 | 在线视频久久 | 色综久久 | 成人av电影在线观看 | 日本二区在线观看 | 成人片免费看 | 日韩在线免费播放 | 美女国产精品 | 国产色| a在线观看 | 国产精品1区 | 亚洲精品99999| 一区二区三区日韩精品 | 国产一区二区三区四 | 久久香蕉精品视频 | 青青草视频网站 | 正在播放国产精品 |