亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

詳解提高使用Java反射的效率方法

2024-05-05 00:08:41
字體:
來源:轉載
供稿:網友

在我們平時的工作或者面試中,都會經常遇到“反射”這個知識點,通過“反射”我們可以動態的獲取到對象的信息以及靈活的調用對象方法等,但是在使用的同時又伴隨著另一種聲音的出現,那就是“反射”很慢,要少用。難道反射真的很慢?那跟我們平時正常創建對象調用方法比慢多少? 估計很多人都沒去測試過,只是”道聽途說“。下面我們就直接通過一些測試用例來直觀的感受一下”反射“。
正文

準備測試對象

下面先定義一個測試的類TestUser,只有id跟name屬性,以及它們的getter/setter方法,另外還有一個自定義的sayHi方法。

public class TestUser { private Integer id; private String name;  public String sayHi(){  return "hi"; } public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } public String getName() {  return name; } public void setName(String name) {  this.name = name; }}

測試創建100萬個對象

// 通過普通方式創建TestUser對象@Testpublic void testCommon(){ long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){  ++i;  user = new TestUser(); } long end = System.currentTimeMillis(); System.out.println("普通對象創建耗時:"+(end - start ) + "ms");}//普通對象創建耗時:10ms
// 通過反射方式創建TestUser對象@Testpublic void testReflexNoCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){  ++i;  user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance(); } long end = System.currentTimeMillis(); System.out.println("無緩存反射創建對象耗時:"+(end - start ) + "ms");}//無緩存反射創建對象耗時:926ms

在上面這兩個測試方法中,筆者各自測了5次,把他們消耗的時間取了一個平均值,在輸出結果中可以看到一個是10ms,一個是926ms,在創建100W個對象的情況下,反射居然慢了90倍左右。wtf?差距居然這么大?難道反射真的這么慢?下面筆者換一種反射的姿勢,繼續測試一下,看看結果如何

// 通過緩存反射方式創建TestUser對象@Testpublic void testReflexWithCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; Class rUserClass = Class.forName("RefleDemo.TestUser"); int i = 0; while(i<1000000){  ++i;  user = (TestUser) rUserClass.newInstance(); } long end = System.currentTimeMillis(); System.out.println("通過緩存反射創建對象耗時:"+(end - start ) + "ms");}//通過緩存反射創建對象耗時:41ms

其實通過代碼我們可以發現,是Class.forName這個方法比較耗時,它實際上調用了一個本地方法,通過這個方法來要求JVM查找并加載指定的類。所以我們在項目中使用的時候,可以把Class.forName返回的Class對象緩存起來,下一次使用的時候直接從緩存里面獲取,這樣就極大的提高了獲取Class的效率。同理,在我們獲取Constructor、Method等對象的時候也可以緩存起來使用,避免每次使用時再來耗費時間創建。

測試反射調用方法

@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){  ++i;  method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("反射調用方法耗時:"+(end - start ) + "ms");}//反射調用方法耗時:330ms
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){  ++i;  method.setAccessible(true);  method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("setAccessible=true 反射調用方法耗時:"+(end - start ) + "ms");}//setAccessible=true 反射調用方法耗時:188ms

這里我們反射調用sayHi方法1億次,在調用了method.setAccessible(true)后,發現快了將近一半。查看API可以了解到,jdk在設置獲取字段,調用方法的時候會執行安全訪問檢查,而此類操作會比較耗時,所以通過setAccessible(true)的方式可以關閉安全檢查,從而提升反射效率。

極致的反射

除了上面的手段,還有沒有什么辦法可以更極致的使用反射呢?這里介紹一個高性能反射工具包ReflectASM。它是通過字節碼生成的方式來實現的反射機制,下面是一個跟java反射的性能比較。

Java,反射,效率

結語

最后總結一下,為了更好的使用反射,我們應該在項目啟動的時候將反射所需要的相關配置及數據加載進內存中,在運行階段都從緩存中取這些元數據進行反射操作。大家也不用懼怕反射,虛擬機在不斷的優化,只要我們方法用的對,它并沒有”傳聞“中的那么慢,當我們對性能有極致追求的時候,可以考慮通過三方包,直接對字節碼進行操作。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一黄色网| 97在线免费观看视频| 久久久国产精品一区| 国产视频精品在线| 亚洲电影av在线| 精品视频在线导航| 欧美日韩另类字幕中文| 国产成人福利视频| 国产精品视频网站| 久久久精品影院| 国产亚洲精品综合一区91| 久久精品这里热有精品| 影音先锋日韩有码| 亚洲国产欧美一区二区三区久久| 日韩精品在线免费| 精品国产91久久久| 一区二区三区视频在线| 国产精品视频久| 2018中文字幕一区二区三区| 欧洲成人免费视频| 黑人巨大精品欧美一区二区一视频| 深夜福利日韩在线看| 欧美亚洲成人网| 久久久精品在线观看| 亚洲美女精品成人在线视频| 国产精品久久久久久久久影视| 国产精品免费视频久久久| 亚洲欧洲国产精品| 2019国产精品自在线拍国产不卡| 久久久国产在线视频| 亚洲欧美日韩精品久久亚洲区| 国产精品福利在线观看| 日韩a**中文字幕| 黄网站色欧美视频| 成人网在线免费观看| 亚洲热线99精品视频| 国产精品中文字幕在线观看| 久久精品国产免费观看| 国产精品久久久999| 在线播放日韩精品| 欧美激情久久久久久| 欧美怡春院一区二区三区| 国产精品久久久久久久av电影| 欧美日韩亚洲系列| 欧美自拍视频在线观看| 色在人av网站天堂精品| 国产精品福利在线观看| 国产国产精品人在线视| 97人人做人人爱| 久久免费视频在线| 久久久亚洲欧洲日产国码aⅴ| 91久久在线播放| 在线成人激情视频| 久久五月天综合| 久久男人av资源网站| 日韩视频在线免费观看| www.亚洲一二| 亚洲精品91美女久久久久久久| 91国内在线视频| 欧洲日韩成人av| 亚洲午夜激情免费视频| 欧美日韩免费在线| 国产欧美va欧美va香蕉在线| 国产精品久久久久久久久久东京| 91最新国产视频| 午夜精品一区二区三区av| 91久久在线视频| 亚洲最大福利视频网| 亚洲欧美日韩在线高清直播| 欧美精品在线观看| 日韩美女av在线| 欧美精品久久久久| www.日本久久久久com.| 欧美中文字幕视频| 久久精品99久久久久久久久| 亚洲精品久久久久久久久| 亚洲香蕉av在线一区二区三区| 午夜精品一区二区三区在线视| 中文字幕亚洲无线码a| 欧美一级在线播放| 日韩电影免费在线观看| 国产精品久久99久久| 久久久久久伊人| 国产日本欧美在线观看| 日韩一级裸体免费视频| 亚洲精品国产精品国自产观看浪潮| 日韩电影免费在线观看中文字幕| 在线观看国产精品91| 日本a级片电影一区二区| 国产精品久久久久999| 成人黄色大片在线免费观看| 热久久这里只有精品| 在线日韩av观看| 欧洲成人性视频| 久久成人这里只有精品| 欧美自拍大量在线观看| 欧美一区二三区| 中文字幕av一区二区| 久久精品国亚洲| 欧美性xxxxxxx| 亚洲香蕉成人av网站在线观看| 国产精品久久久久久久久久免费| 国产精品自产拍在线观看中文| 欧美专区日韩视频| 成人在线中文字幕| 国产91在线播放| 欧美性一区二区三区| 色与欲影视天天看综合网| 亚洲国产精品视频在线观看| 亚洲美女黄色片| 午夜精品福利电影| 6080yy精品一区二区三区| 日韩成人小视频| 91香蕉亚洲精品| 欧美—级a级欧美特级ar全黄| 国产精品久久久91| 欧美二区乱c黑人| 免费不卡欧美自拍视频| 亚洲成人av在线| 不卡在线观看电视剧完整版| 91精品国产综合久久久久久蜜臀| 欧美一级bbbbb性bbbb喷潮片| 欧美大片大片在线播放| 日韩精品在线观看一区二区| 亚洲精品日韩久久久| 成人午夜高潮视频| 亚洲人成网站999久久久综合| 久久久久久久久电影| 亚洲精品456在线播放狼人| 2019日本中文字幕| 青青在线视频一区二区三区| 免费成人高清视频| 亚洲精品影视在线观看| 亚洲www在线观看| 国产91精品最新在线播放| 欧美性xxxxx极品| 亚洲国产中文字幕久久网| 欧美日韩国产中文精品字幕自在自线| 丁香五六月婷婷久久激情| 国产一区二区日韩| 欧美激情精品久久久久久变态| 日韩中文字幕在线看| 国产精品精品一区二区三区午夜版| 伊人久久男人天堂| 日本一区二三区好的精华液| 日韩美女免费线视频| 日产精品久久久一区二区福利| 亚洲精品自拍偷拍| 日韩精品极品毛片系列视频| 日本电影亚洲天堂| 国产69精品久久久久9999| 清纯唯美日韩制服另类| 成人a视频在线观看| 最近2019年日本中文免费字幕| 国产精品www色诱视频| 免费不卡欧美自拍视频| 亚洲精选在线观看| 欧美国产亚洲视频| 国产精欧美一区二区三区| 国产一区二区三区直播精品电影| 欧美午夜女人视频在线| 欧美激情视频一区二区三区不卡| 欧美性猛交xxxx乱大交极品| 国产亚洲精品高潮|