2014-09-18 75 views
2

我正在經常使用MethodHandles.Lookup類的情況下工作。在這種情況下,在多個查找之間保留MethodHandles.lookup()的值是否明智? (具體來說,我正在使用的唯一查找方法是unreflect(java.lang.reflect.Method)。)緩存MethodHandles.lookup()的結果?

這會加快速度,還是會不相關?或者,它會因爲某種原因真的放慢速度嗎?

+0

考慮添加一個java-8標記,因爲它可能正在受到核心Java團隊更嚴密的監視。你也可以用'jmh'做一些實際的測量。 – 2014-09-18 21:04:47

+1

我懷疑你會發現他們已經被緩存在幕後。一般來說,你應該對應用程序緩存保持警惕。他們通常比他們的價值更麻煩,我從痛苦的經歷中講話。 – EJP 2014-09-19 00:10:56

+0

你不反映什麼樣的方法?如果他們是'public',則可以使用['publicLookup()'](http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandles.html#publicLookup())已經是一個單身人士。 – Holger 2014-09-19 08:09:56

回答

1

與往常一樣,性能,唯一的好答案是測試,測量,測試一而再,再測量......

話雖這麼說,是緩存可能會更快,問題是會是顯著更快你的上下文。

緩存的缺點是內存使用和線程安全。 MethodHandle本身似乎是不可變的(沒有明確記錄,但看着合同,這很可能是這種情況)。 MethodHandles.Lookup用於檢查安全約束,因此緩存可能允許您繞過或至少更改有關安全約束的行爲。這可能會或可能不會成爲您的擔憂。

如果緩存大量不同的MethodHandle,則內存使用會發揮作用。您需要確保緩存的大小和大小正確。我的猜測是,你不會緩存很多不同的實例,但這只是一個猜測......