检测是否在Java中的接口中声明了方法

时间:2009-12-23 19:51:28

标签: java reflection methods

帮助我让这个方法更加扎实:

 /**
  * Check if the method is declared in the interface.
  * Assumes the method was obtained from a concrete class that 
  * implements the interface, and return true if the method overrides
  * a method from the interface.
  */
 public static boolean isDeclaredInInterface(Method method, Class<?> interfaceClass) {
     for (Method methodInInterface : interfaceClass.getMethods())
     {
         if (methodInInterface.getName().equals(method.getName()))
             return true;
     }
     return false;
 }

5 个答案:

答案 0 :(得分:10)

这个怎么样:

try {
    interfaceClass.getMethod(method.getName(), method.getParameterTypes());
    return true;
} catch (NoSuchMethodException e) {
    return false;
}

答案 1 :(得分:1)

这是一个好的开始:

替换:

for (Method methodInInterface : interfaceClass.getMethods())
 {
     if (methodInInterface.getName().equals(method.getName()))
         return true;
 }

使用:

for (Method methodInInterface : interfaceClass.getMethods()) {
     if (methodInInterface.getName().equals(method.getName())) {
         return true;
     }
 }

:)

答案 2 :(得分:1)

如果您想避免从Yashai's answer抓取NoSuchMethodException

for (Method ifaceMethod : iface.getMethods()) {
    if (ifaceMethod.getName().equals(candidate.getName()) &&
            Arrays.equals(ifaceMethod.getParameterTypes(), candidate.getParameterTypes())) {
        return true;
    }
}
return false;

答案 3 :(得分:0)

为了使您的方法更加健壮,您可能还想检查Class#isInterface()是否为给定的类返回true,否则抛出IllegalArgumentException

答案 4 :(得分:-1)

参见Method#getDeclaringClass(),然后只将Class对象与预期的接口进行比较。