2014-02-26 128 views

回答

18

您可以使用反射

public static void main(String[] args) throws Exception { 
    Method method = Bar.class.getMethod("hashCode" /*, new Class<?>[] {...} */); // pass parameter types as needed 
    System.out.println(method); 
    System.out.println(overridesMethod(method, Bar.class)); 
} 

public static boolean overridesMethod(Method method, Class<?> clazz) { 
    return clazz == method.getDeclaringClass(); 
} 

class Bar { 
    /* 
    * @Override public int hashCode() { return 0; } 
    */ 
} 

將打印false如果hashCode()被註釋掉和true如果事實並非如此。

Method#getDeclaringClass()將返回實現它的類的Class對象。

備註Class#getMethod(..)僅適用於public方法。但在這種情況下,equals()hashCode()必須是public。該算法需要根據其他方法進行更改。

+0

重要提示:我沒有意識到這一點,直到我看着它,但'getMethod(「的hashCode」)'不是簡單地返回一個名爲'hashCode方法';它返回一個名爲'hashCode' **的方法,不帶參數**。 'getMethod'採用'類'參數的可變參數列表,該參數必須與方法的參數匹配,並且如果沒有這樣的參數,它只匹配零參數的方法。這從上面的代碼中並不明顯,我認爲它是有缺陷的(如果該類聲明瞭帶參數的'hashCode'),直到我查找它爲止。 – ajb

+0

細化:OP沒有說如果類'A'覆蓋'equals'和'hashCode',而類'B'擴展'A'但是不覆蓋它們會發生什麼。如果期望的結果仍然是「真」(因爲它沒有使用「Object」默認值),請將clazz == method.getDeclaringClass()更改爲Object.class!= method.getDeclaringClass()。 [但我沒有測試。] – ajb

+0

@ajb爲了您的完善,這將是實現它的方法。在這種情況下,不需要傳遞目標'Class'。 –

2

要檢查您的類中是否聲明瞭方法,您可以使用下面的代碼。

System.out.println(C.getMethod("yourMethod").getDeclaringClass().getSimpleName()); 

這裏您可以找到聲明類的名稱。

因此,請使用您的子類中的代碼檢查equals或hasCode方法。和匹配,如果申報類名相同,您所需的類

+0

我寧願使用''==在類,而不是試圖匹配的名字,以防萬一有人用幽默的名字嵌套類或內部類'Object'的一個反常的感覺。 – ajb

相關問題