扩展方法类型的相等性检查

时间:2009-07-23 20:20:17

标签: java reflection

假设我有一个界面:

public interface FooInterface {
        public void someMethod();
    }

我有一个实现此接口的类:

public class FooClass implements FooInterface {
        public void someMethod() {
            //do cool things
        }
        public void someOtherMethod() {
            //do other cool things
        }
    }

有没有一种简单的方法可以反过来找到FooClass上的方法,该方法映射到FooInterface上的someMethod?

我有类似于以下内容进行此计算,但我很好奇是否有人知道使用Java内置系统来进行此计算?我已经制定了以下代码来执行此操作(可能存在错误,请注意):

public boolean isMethodEquality(Method meth1, Method meth2) {

  //Check declaring classes for equality
  boolean isAssignable;
  isAssignable = meth1.getDeclaringClass().isAssignableFrom(
    meth2.getDeclaringClass();
  isAssignable |= meth2.getDeclaringClass().isAssignableFrom(
    meth1.getDeclaringClass());
  if (!isAssignable) {
      return false;
  }
  //check the names for equality
  if (!meth1.getName().equals(meth2.getName())) {
    return false;
  }
  //check the parameters for equality
  if (meth1.getParameterTypes().length != meth2.getParameterTypes().length) {
    return false;
  }
  for (int i = 0; i < meth1.getParameterTypes().length; i++) {
    if (!meth1.getParameterTypes()[i].equals(meth2.getParameterTypes()[i])) {
      return false;
    }
  }
  return true;
}

以上应检查签名。是否有其他内置方法可以做到这一点?

我接受了.equals,但这没有用,这是有道理的。这些方法是同一方法的不同实现模式(在这种情况下,一个只是一个没有定义的声明,另一个是定义)。

我也意识到我可以简单地添加一个可继承的注释,但我宁愿避免这种情况,因为它会导致类爆炸。

正如其中一位评论者所指出的,Annotations仅在类上继承。有关详细信息,请参阅java docs

我真正想要的是方法的“isAssignableFrom”,或者是一种轻松比较方法签名的方法。

感谢。

2 个答案:

答案 0 :(得分:3)

最简单的(不,它不会表现不错,但可能是你在这种情况下不关心的事情)这样做的方法就是调用concreteClass.getMethod():< / p>

Method interfaceMethod = ...; // method whose implementation you're looking for
try {
    Method implementationMethod = concreteClass.getMethod(
        interfaceMethod.getName(), interfaceMethod.getParameterTypes());
} catch (NoSuchMethodException E) {
    // your class may be abstract and thus would not implement given method
} catch (SecurityException E) {
    // insufficient permissions
}

答案 1 :(得分:0)

方法实现了equals,所以你应该能够调用它。该定义与您正在进行的操作略有不同。如果你需要它专门遵循你正在编写的逻辑,那么你将不得不推出自己的AFAIK。