【发布时间】:2015-12-18 11:39:16
【问题描述】:
我想检查一个类是否实现了特定接口的所有方法而不直接实现它。
即考虑接口
public interface MyInterface {
public String myMethod();
}
以及以下类:
A实现了接口,方法myMethod也实现了
public class A implements MyInterface {
public String myMethod() {
return "something";
}
}
B没有实现接口,但是有方法myMethod
public class B {
public String myMethod() {
return "something else";
}
}
所以MyInterface.class.isAssignableFrom(A.class); 是true 而MyInterface.class.isAssignableFrom(B.class); 是false。我正在寻找一种对两个类都返回 true 的方法。
使用反射,对于每个类,我可以循环访问接口的方法并检查它是否在类中实现。有没有更聪明的方法来做到这一点?
【问题讨论】:
-
反思是一种方法
-
我很好奇你想在这里实现什么。 Java 并不是真正的鸭式语言,那么它的价值是什么?我的意思是,实现某个接口指定的所有方法并不意味着该类可以以任何有意义的方式与该接口的用户交互。
-
@sisyphus 我生成了一个 Web 服务客户端,我得到了许多具有相同方法的类(Web 方法的返回类型)。由于 Web 服务客户端会多次生成,所以我倾向于避免编辑生成的类。
-
放置实现 MyInterface 更安全,即使是 100 个类。在那里,您的代码将更加健壮,对于新的......或者使用反射。不太难。
-
如果您通过反射执行此操作,则涉及大量工作 - 签名需要匹配,但不需要完全匹配。因此,您必须能够处理协变返回类型、通过不同数量的参数覆盖方法、扩大/缩小参数类型以及扩大/缩小异常处理。