2009-10-05 73 views
1

如果我使用反射,並且想要查找是否實現了方法,那麼我可以使用getMethod()方法。這個方法拋出一個NoSuchMethodException異常。覆蓋標準JVM的fillInStackTrace例外

有沒有辦法重載此Exception的fillInStackTrace以優化性能?目前,大約40%的時間都花在了這種方法上。

我正在使用異常的框架來執行某種控制流。

所以我不想太侵入。如果我創建延伸的Throwable類,並使用這個新的類,而不是NoSuchMethodException,我有這樣的:

NewException is never thrown in body of corresponding trystatement 

感謝

回答

1

沒有,因爲getMethod()電話new直接因爲類是有符號,你不能代替代碼NoSuchMethodExceptionfillInStackTrace()native

最好的辦法是將呼叫緩存到getMethod()在一箇中心位置:只需創建一個兩級地圖:Map<Class, Map<String, Method>>並使用快速查找,無任何異常投擲。

+0

但如果我有很多很多類,地圖將是巨大的。我將不得不大幅改變框架。難... – LB40 2009-10-05 16:36:02

+0

所以我發現調用getMethods並遍歷數組似乎更快。謝謝您的幫助。我能夠以這種方式將呼叫打包到getMethod。 – LB40 2009-10-05 18:20:55

1

我的兩個以下幾點做的不完全的解決方案標題你的問題,但我認爲他們可能是有幫助的...


我確認您的性能指標。

我在Java性能手冊中閱讀了解決方案。我們已經將它應用於我們自己的應用程序,但有一些例外(堆棧跟蹤不重要,可能的頻率很高)。我不知道你是否會喜歡它; ;-)

創建一個Exception類的獨特實例,存儲它。拋出那個例子

當您不想打擾依賴於例外的現有流程時,這似乎很理想。


如果您的編譯器抱怨沒有拋出該異常的其他方法,那是因爲您選擇了一個選中的異常。
使用RuntimeException的子類(它們未被選中,因此編譯器不知道它們是否被拋出,他不會抱怨)。

+0

關於第一個解決方案,我不能這樣做,因爲我不會拋出異常。我認爲我的第一個解決方案是非常愚蠢的,因爲我犯了混亂投擲和捕捉的錯誤,即使我發現我自己的異常並不意味着這是一個拋出.. – LB40 2009-10-05 16:30:43