getDeclaredMethods()和隐藏的超类静态方法

时间:2010-11-04 01:34:46

标签: java reflection static static-methods method-hiding

根据http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29,Class.getDeclaredMethods()应该只包含“由类声明”的方法。但是,我在下面的测试代码中获得了一些非常令人惊讶的结果:

import java.util.Arrays;

class A {
 public static A m1() { return null; }
 public static A m2() { return null; }
 public static A m3() { return null; }
}

class B extends A {
 public static A m1() { return null; }
 public static B m2() { return null; }
// public static Object m3() { return null; } won't compile
}


public class Scratch {
 public static void main(final String[] args) {
  System.out.println(Arrays.asList(B.class.getDeclaredMethods()));
 }
}

一些看起来很奇怪/令我惊讶的事情:

  • 编译器抱怨B.m3()与A.m3()具有不兼容的返回类型。这由JSL 8.4.8.3(第225页v3 langspec-3.0.pdf)规定。但我很好奇,为什么这个限制需要适用于静态方法。我的理解是静态方法可以被隐藏而不被覆盖,并且引用在编译时被解析,那么这个限制背后的原因是什么?

  • 输出中包含两个m2()方法。这似乎与getDeclaredMethods()仅返回“由类声明”的方法和“排除继承的方法”的说法相矛盾。我没有看到A.m2()为“由B宣布”。

  • 输出中包含一个m1()。在前一点之后,如果让getDeclaredMethods()返回两个m2()是有意义的,为什么它也不返回两个m1()?它们毕竟是两种不同的方法,一种是另一种隐藏的方法。在m1()和m2()的情况之间我没有看到任何有趣的区别,除了在m1()的情况下返回类型是相同的,但是我理解的返回类型不是方法签名的一部分? / p>

提前致谢!

2 个答案:

答案 0 :(得分:3)

我可以确认Oracle Java Windows 64位1.6.0_35中仍然存在错误http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

答案 1 :(得分:2)

请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

虽然在2009-03-11 05:44:57.0报告了1.6.0_12-b04  但是Sun在2010-07-22 01:25:56.0接受了它。

简要说明:

概要(反映)Class.getDeclaredMethods()返回继承的方法

类别 java:classes_lang

举报反对

状态 3-Accepted,bug

优先级: 3-Medium

提交日期 11-MAR-2009

解决方案 N / A

评估将进行调查。

发布日期: 2010-07-22 01:25:56.0