2010-11-04 86 views
7

根据http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29,Class.getDeclaredMethods()应该只包含“由类声明”的方法。但是,我得到了一些非常令人惊讶的结果与下面的测试代码:看起来很奇怪/令我感到诧异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规定(p.23 langspec-3.0.pdf)。但我很好奇,为什么这个限制需要适用于静态方法。我的理解是,静态方法可以被隐藏并且不会被覆盖,并且引用在编译时被解析,所以这个限制背后的推理是什么?

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

  • 一个m1​​()包含在输出中。继上一点之后,如果让getDeclaredMethods()返回两个m2(),为什么它不返回两个m1()呢?毕竟他们是两种截然不同的方法,一种被另一种隐藏。除了在m1()的情况下返回类型相同之外,我没有看到m1()和m2()的情况之间的任何差异,但是我知道返回类型不是方法签名的一部分吗?

在此先感谢!

+0

对我来说,一个'm2'包含在输出(jdk_1.6.0_21)中。 – axtavt 2010-11-04 12:58:17

+0

我有两个使用jdk_1.6.0u18的m2()。那么这个东西在u18和u21之间是固定的吗?如果是这样的话,是否有固定的票证? thx – RAY 2010-11-05 01:41:48

回答

2

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

虽然已经报警对1.6.0_12-B04上2009-03-11 05:44:57.0 但是Sun接受它2010-07-22 01:25:56.0

在简要:

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

类别的java:classes_lang

报道反对

国家 3-接受,错误

优先级: 3 - 中

提交日期 11-MAR-2009

解决办法 N/A

评估将进行调查。

发布日期: 2010-07-22 01:25:56。0

+0

“将调查”... ... – RAY 2010-11-05 06:48:28

+0

:D它是或Acle效果! – 2010-11-05 06:57:18