根据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()的情况之间的任何差异,但是我知道返回类型不是方法签名的一部分吗?
在此先感谢!
对我来说,一个'm2'包含在输出(jdk_1.6.0_21)中。 – axtavt 2010-11-04 12:58:17
我有两个使用jdk_1.6.0u18的m2()。那么这个东西在u18和u21之间是固定的吗?如果是这样的话,是否有固定的票证? thx – RAY 2010-11-05 01:41:48