如何提高使用Java反射的效率

2021-09-19 19:00:32 字數 2183 閱讀 8722

前言

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

正文

準備測試物件

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

public class testuser 

public integer getid()

public void setid(integer id)

public string getname()

public void setname(string name)

}

測試建立100萬個物件

// 通過普通方式建立testuser物件

@test

public void testcommon()

long end = system.currenttimemillis();

system.out.println("普通物件建立耗時:"+(end - start ) + "ms");

}//普通物件建立耗時:10ms

// 通過反射方式建立testuser物件

@test

public void testreflexnocache() throws exception

long end = system.currenttimemillis();

system.out.println("無快取反射建立物件耗時:"+(end - start ) + "ms");

}//無快取反射建立物件耗時:926ms

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

// 通過快取反射方式建立testuser物件

@test

public void testreflexwithcache() throws exception

long end = system.currenttimemillis();

system.out.println("通過快取反射建立物件耗時:"+(end - start ) + "ms");

}//通過快取反射建立物件耗時:41ms

咦?這種操作只需要41ms了,大大提高了反射建立物件的效率。為什麼會快這麼多呢?

其實通過**我們可以發現,是class.forname這個方法比較耗時,它實際上呼叫了乙個本地方法,通過這個方法來要求jvm查詢並載入指定的類。所以我們在專案中使用的時候,可以把class.forname返回的class物件快取起來,下一次使用的時候直接從快取裡面獲取,這樣就極大的提高了獲取class的效率。同理,在我們獲取constructor、method等物件的時候也可以快取起來使用,避免每次使用時再來耗費時間建立。

測試反射呼叫方法

@test

public void testreflexmethod() throws exception

long end = system.currenttimemillis();

system.out.println("反射呼叫方法耗時:"+(end - start ) + "ms");

}//反射呼叫方法耗時:330ms

@test

public void testreflexmethod() throws exception

long end = system.currenttimemillis();

system.out.println("setaccessible=true 反射呼叫方法耗時:"+(end - start ) + "ms");

}//setaccessible=true 反射呼叫方法耗時:188ms

java反射效率

測試背景 1.測試簡單bean int,integer,string 的set方法 2.loop 1億次 3.測試 盡可能避免物件的建立,方法的呼叫,僅僅測試set方法的耗時 測試結果 場景 本機測試結果 xp,雙核,2g 伺服器測試結果 linux,xen虛擬機器,8核,5.5g 方法直接呼叫 2...

如何提高編碼的效率

1 明確專案需求 2 將專案需求細分,形成每乙個具體的,可實現的過程 3 如果乙個專案實現,需要到多種新的技術,而這些技術我們之前又沒有接觸過,建議每一種技術先看一些基本的簡單例子,自己動手做做乙個簡單的damo,掌握了相關的技術細節後,再遷移到開發的專案中來 4 如何快速解決專案開發中遇到的問題。...

如何提高hbase的效率

一 建表技巧 1 合理設計列族,盡量控制在3個以內,因為當乙個列族的memstore達到閥值進行擴容的時候,另外乙個列族的memstore也會跟著一起擴容 不同的列族分為不同的store,但是 的時候是整個region都會 這樣會出現某些memstore資料量並不大但是分在了多個region中,降低...