好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 詳解提高使用Java反射的效率方法

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

熱門標簽:電銷機器人問門薩維品牌my 廣東廣州在怎么申請400電話 咸寧銷售電銷機器人系統 百度地圖怎樣標注圖標 余姚電話機器人 開發地圖標注類網站 外呼系統能給企業帶來哪些好處 百度地圖標注偏差 400電話蘭州申請請

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

準備測試對象

下面先定義一個測試的類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(i1000000){

  ++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(i1000000){

  ++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(i1000000){

  ++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(i100000000){

  ++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(i100000000){

  ++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反射機制的講解
  • java反射機制Reflection詳解
  • Java對類私有變量的暴力反射技術講解
  • Java在利用反射條件下替換英文字母中的值
  • Java動態代理和反射機制詳解
  • Java注解與反射原理說明
  • 實例講解Java基礎之反射

標簽:臨沂 巴彥淖爾 銅陵 衡陽 麗江 重慶 鷹潭 十堰

巨人網絡通訊聲明:本文標題《詳解提高使用Java反射的效率方法》,本文關鍵詞  詳解,提高,使用,Java,反射,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解提高使用Java反射的效率方法》相關的同類信息!
  • 本頁收集關于詳解提高使用Java反射的效率方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产激情久久久久久一级A片老师| 第四色亚洲| 嗯…啊摸湿男女吻下面小说| 巨茎挺进李淑芬的体内视频| 444777在线观看| 双性,产乳,生子(高H)小说| 乳色视频库RSeAV丶cc| 44383亚洲大成网人网站| 老公的朋友| 肥白熟老女16p| 免费无码AV在线观看麻豆多多| 60岁老熟女A片免费观看| 白色白在线观看免费完整版| 国产精品剧情原创麻豆国产| 在卧室里征服美艳妈妈在线观看 | 91国内视频| a毛片免费在线观看| 怀孕大肚子高潮做视频播放| 国产农村一级AA毛片| 欧美色视频日本片免费 | 少妇张莹高潮时被躁得直叫 | 我在开会他在下添的很爽| 天干天干天夜夜爽啪| 久久久久免费毛A片免费一瓶梅| 5x社区-5x在视频5xSQ| 性生大片30分钟免费观看669| 久久天堂夜夜一本婷婷麻豆| 国产一级毛片精品A片在线美传媒 国产伦精品毛片一区二区免妓女 女人18毛多水多A片毛片 | 欧美一级色片| 国产A级特黄的片子,| 男人狂躁进女人免费视频| 免费观看无遮挡www的小视频| 欧美Av又水又骚又爽免费观看| 精品91一区二区三区| videossex性暴力| 国产高潮抽搐喷白浆| 亚洲午夜久久久久中文字幕| 国产婬妇????視频| 久久综合亚洲色hezyo国产| 婬荡高潮叫床好大好硬18禁| 日韩A片一级无码免费??蜜桃|