【发布时间】:2017-04-27 23:46:27
【问题描述】:
在 JLS 中阅读此 part:
如果一个接口没有直接的超接口,则该接口隐式声明一个公共抽象成员方法 m,签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s,返回类型为 r 的公共实例方法 m,并且在 Object 中声明 throws 子句,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。
我试图通过反射确认这些方法的存在,但只出现了ok方法。
为什么不显示隐式声明的方法?我怎样才能看到它们?
interface C {
public void ok();
}
public class Test{
public static void main(String[] args) {
for (Method m : C.class.getMethods()) {
System.out.println(m.getName()+":"+Modifier.isAbstract(m.getModifiers()));
}
}
}
输出:
ok:true
【问题讨论】:
-
实例化一个
C实例,并查看它的方法。或者在C实例上调用toString。C c = new SubC(); System.out.println(c.toString()); -
@ElliottFrisch:这并不能证明隐式
public abstract方法声明的存在。 -
我认为这要么是实现错误,要么是 JLS 缺陷。
-
@ElliottFrisch,我同意 user2357112 。如果我将代码应用于类,它将在 reflect.Methods 中打印 Object 方法
标签: java methods reflection language-lawyer