从类和接口重新继承静态字段

spe*_*ed9 7 java reflection inheritance interface superclass

interface A {
    public static String name = "A";
}
interface B {
    public static String name = "B";
}
class X implements A { }
class Y extends X implements B { }
public void test_getField() {
    try {
        assertEquals(B.class.getField("name"), Y.class.getField("name"));
    } catch (NoSuchFieldException e) {
        fail("Got exception");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么Y.class.getField("name")返回B.name而不是A.name?Java规范中有没有答案?

孙兴斌*_*孙兴斌 4

直接超接口将在超类之前搜索,请参阅以下文档getField

要反映的字段由以下算法确定。设 C 为该对象所代表的类:

如果 C 声明了一个具有指定名称的公共字段,则该字段就是要反映的字段。

如果在上面的步骤 1 中没有找到字段,则该算法将递归地应用于C 的每个直接超级接口。直接超级接口按照声明的顺序进行搜索。

如果在上面的步骤 1 和 2 中没有找到字段,并且 C 有一个超类 S,则在 S 上递归调用该算法。如果 C 没有超类,则抛出 NoSuchFieldException。