2012-07-16 91 views
2

我遇到了一種情況,其中有一個來自接口定義的Method實例和來自實現類的相同方法的Method實例。檢查超類/接口方法和等式的重寫方法

例如:

public interface Foo { 
    void bar(); 
} 

public class FooImpl implements Foo { 
    public void bar() { 
     System.out.println("foobar"); 
    } 
} 

使用反射,我從Foo接口,並從FooImpl其派生實現獲得的bar一個Method實例。從本質上講,我需要考慮這些Methods相等,但顯然equals方法表明它們是不等價的。

具體而言,我需要一種方法來確定通過反射獲得的給定Method是否覆蓋超類/接口Method

我目前使用通過從給定的類找到「來源至少」方法完全避免了局勢的解決辦法,但我不知道是否有一個更優雅的解決方案。

+0

你需要這個在運行時?否則,文檔應該使用'@ Override'標籤來解決這個問題。 – Simulant 2012-07-16 19:25:30

+0

是的,我在運行時需要它。 – 2012-07-16 19:27:01

回答

0

我還沒有采取修飾符考慮在equals方法,但如果你想使用這種算法這應該讓你相當接近:

package test; 

import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.List; 

public class TestFooBar { 
@SuppressWarnings("rawtypes") 
public static void main(String[] args) { 
    try { 
     // Get the class of interest 
     Class fooImpl = Class.forName("test.FooImpl"); 

     // Test all the methods 
     for(Method m : fooImpl.getMethods()) { 
      boolean overriden = false; 
      List<Class> parents = new ArrayList<Class>(); 
      for(Class c : fooImpl.getInterfaces()) { 
       parents.add(c); 
      } 
      if(fooImpl.getSuperclass() != null) parents.add(fooImpl.getSuperclass()); 
      for(Class c : fooImpl.getInterfaces()) { 
       for(Method sm : c.getMethods()) { 
        if(equals(sm, m)) { 
         overriden = true; 
         break; 
        } 
       } 
       if(overriden) break; 
      } 
      System.out.println(m+": "+(overriden ? "Overriden" : "Not overriden")); 
     } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static boolean equals(Method m1, Method m2) { 
    if(!m1.getName().equals(m2.getName())) return false; 
    String t1 = ""; 
    for(Class c : m1.getParameterTypes()) { 
     t1+=c.getName()+"/"; 
    } 
    String t2 = ""; 
    for(Class c : m2.getParameterTypes()) { 
     t2+=c.getName()+"/"; 
    } 
    if(!t1.equals(t2)) return false; 

    return true; 
} 
} 
+0

謝謝。是的,我考慮簡單地檢查方法名稱和參數類型,但希望有一個更全面的方法。 – 2012-07-16 19:46:16

+0

井,該方法是不相等的(從對象的角度來看至少)。他們只是在邏輯上等於根據你提出這樣不幸的是你無法迴避必須實現的算法這些條件的條件。 – mprivat 2012-07-16 19:51:50

+0

我遇到了這個問題,但我也與仿製藥的工作,有它變得差了很多:在界面,你會發現,返回類型/參數「java.lang.Object繼承」的方法。在實現類,你會發現具有相同簽名(對象),但另一個具有基於您的通用定義的回報/參數類型的方法。哦,你沒有得到它們,因爲你叫「getMethods()」; 「getDeclaredMethods()」也會返回兩個方法。 – 2013-03-11 09:13:29

相關問題