2012-07-16 73 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