【问题标题】:getDeclaredMethods() and hidden super class static methodgetDeclaredMethods() 和隐藏的超类静态方法
【发布时间】:2011-05-04 20:06:40
【问题描述】:

根据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() 的情况下返回类型相同,但我理解的返回类型不是方法签名的一部分?

提前致谢!

【问题讨论】:

  • 对我来说,输出中包含一个m2 (jdk_1.6.0_21)。
  • 我使用 jdk_1.6.0u18 得到了两个 m2()。那么这是在 u18 和 u21 之间解决的问题吗?如果是这种情况,是否有固定票?谢谢

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


【解决方案1】:

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-已接受,错误

优先级: 3-中

提交日期 2009 年 3 月 11 日

解决方法不适用

评估将调查。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2017-07-22
      • 2015-05-31
      • 2022-06-19
      相关资源
      最近更新 更多