根据 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/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()情况下返回类型相同,但是据我了解,返回类型不是方法签名的一部分吗?

提前致谢!

有帮助吗?

解决方案

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:class_lang

报告 反对

状态 3次认可的错误

优先事项: 3中

提交日期 2009年3月11日

解决 N/A。

评估 将调查。

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top