7

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)によって規定されています。しかし、なぜこの制限を静的メソッドに適用する必要があるのか​​、興味があります。私の理解では、静的メソッドは非表示にしてオーバーライドすることはできず、参照はコンパイル時に解決されるので、この制限の背後にある理由は何ですか?

  • 2つのm2()メソッドが出力に含まれています。これは、getDeclaredMethods()が「クラスによって宣言された」メソッドのみを返し、「継承されたメソッドを除外する」という主張と矛盾するようです。A.m2()がBによって「宣言された」とは見なされません。

  • 1つのm1()が出力に含まれます。前のポイントに続いて、getDeclaredMethods()が2つのm2()を返すようにすることが理にかなっている場合、なぜ2つのm1()も返さないのでしょうか。それらは結局2つの異なる方法であり、一方は他方によって隠されています。m1()の場合のリターンタイプが同じであることを除いて、m1()の場合とm2()の場合の基本的な違いはわかりませんが、私が理解しているリターンタイプはメソッドシグネチャの一部ではありませんか?

前もって感謝します!

4

2 に答える 2

3

バグhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786がOracleJavaWindows64ビット1.6.0_35にまだ存在していることを確認できます。

于 2012-10-09T21:29:40.380 に答える
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にそれを受け入れました。

簡単に言えば:

概要 (reflect)Class.getDeclaredMethods()は継承されたメソッドを返します

カテゴリ java:classes_lang

に対して 報告

状態 3-承認済み、バグ

優先度: 3-中

提出日 2009年3月11日

回避策 N/A

評価 調査します。

投稿日: 2010-07-22 01:25:56.0

于 2010-11-05T06:33:22.807 に答える