簡體   English   中英

是什么決定了Class.getMethods()的返回順序?

[英]What determines the return order of Class.getMethods()?

這個問題不是尋找問題的解決方案,而是解釋為什么可能出現問題(或不是!)。

Class.getMethods()Javadocs說:

返回的數組中的元素沒有排序,也沒有任何特定的順序。

問題是:我們一直在使用一個名為JMTE的整潔的小Java模板庫,可能已經有幾年了,沒有任何問題。 這使用類似JSTL的語法將模型值注入模板。 特別是,我們一直在使用這樣的東西來代價:

${vendor.currency.symbol} ${order.amount}

第一個轉換為以下內容:

vendor.getCurrency().getSymbol()

其中getCurrency()返回java.util.Currency對象。 貨幣有兩種獲取貨幣符號的方法 - 一種采用特定的Locale,另一種采用默認的。

public String getSymbol()

public String getSymbol(Locale locale)

在過去的18個月左右,一切運行正常,電子郵件中出現貨幣代碼/符號。 然后5天前,當我們嘗試替換${vendor.currency.symbol}時,我們開始拋出一個隨機的IllegalArgumentException

經過一些調試后,我發現了JMTE內部的原因:

for (Method method : declaredMethods) {
    if (Modifier.isPublic(method.getModifiers())
        && (method.getName().equals("get" + suffix) ||   
            method.getName().equals("is" + suffix))) {
                value = method.invoke(o, (Object[]) null);
                ....
            }
}

即,是否getSymbol()getSymbol(Locale)完全getSymbol(Locale) Class.getMethods()的返回順序( 不是以任何特定的順序 )。 我添加了一個測試,以確保方法有0參數,我的問題解決了。

現在,由於一個奇怪的巧合,其他人碰巧在我們第一次觀察到這種行為的同一天提交了相同的修復

令人費解的是,這段代碼已經運行了18個月而沒有任何問題,然后突然出現這種行為。

當我創建一個測試用例時,它大約有50%的時間失敗,正如人們所期望的那樣(有兩種匹配的方法,沒有特定的順序返回),所以我很困惑(驚訝)它工作了18個月和10 ^ 5處決。 (可以想象,但不太可能,它已經失敗但在隨后的重試中取得了成功)。

純粹出於好奇 ,我想知道Java運行時中是否有任何可能導致這種潛在行為突然出現的東西。 更令人費解的是,在同一天,其他人應該為一個成熟穩定的項目提供這種行為的解決方案 - 這可能意味着同樣的潛在行為突然在其他地方實現了。

所以,問題是:有沒有人知道哪些因素可能會影響Class.getMethods()返回的方法的順序?

getMethods()可以看到的相關Java代碼顯示了很多對緩存數據的檢查,但最后的說法取決於這個實現:

private native Method[] getDeclaredMethods0(boolean publicOnly);

因此,它依賴於VM,並且僅僅因為“它很多次都是相同的”而非常缺乏信任該命令的想法。

緩存肯定會影響它,因為如果它第一次正確獲取,它將在隨后的時間工作,除非緩存被清除(有一些軟參考業務等等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM