假设我有一个界面:
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”,或者是一种轻松比较方法签名的方法。
感谢。
答案 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。