Question

Selon http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 , Class.getDeclaredMethods () ne devraient inclure des méthodes « déclarées par la classe". Cependant, je reçois des résultats assez surprenants avec le code de test ci-dessous:

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()));
 }
}

Quelques choses qui ont l'air tout à fait étrange / surprenant pour moi:

  • Le compilateur se plaignent de B.m3 () ayant un type de retour incompatible avec A.m3 (). Ceci est dictée par JSL 8.4.8.3 (Page 225 v3 langspec-3.0.pdf). Mais je suis curieux, pourquoi cette restriction doit appliquer aux méthodes statiques. Je crois comprendre que les méthodes de statiques peuvent être cachés et non overriden, et que la référence est réglée au moment de la compilation, alors quel est le raisonnement derrière cette restriction?

  • méthodes

    Deux m2 () sont inclus dans la sortie. Cela semble contredire l'affirmation selon laquelle getDeclaredMethods () seules les méthodes de retours « déclarés par la classe » et « exclut les méthodes héritées ». Je ne vois pas A.m2 () comme "déclarée par" B.

  • Un m1 () est inclus dans la sortie. À la suite du point précédent, s'il était logique de laisser getDeclaredMethods () retourner deux m2 (), pourquoi ne pas revenir à deux m1 () ainsi? Ils sont après tout deux méthodes distinctes, et on est caché par l'autre. Je ne vois aucune différence FONDAMENTALE entre le cas de m1 () et m2 () à l'exception du type de retour est le même dans le cas de m1 (), mais le type de retour que je comprends ne fait pas partie de la signature de la méthode?

Merci à l'avance!

Était-ce utile?

La solution

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

Bien qu'il avait été rapporté contre 1.6.0_12-b04 sur 2009-03-11 05: 44: 57.0  mais Sun a accepté le 2010-07-22 01: 25: 56,0

en bref:

Synopsis (refléter) Class.getDeclaredMethods () retourne méthodes héritées

Catégorie java: classes_lang

Rapporté contre

État 3 acceptée, bug

Priorité: 3-Medium

Date de dépôt 11-MAR-2009

Autour du travail N / A

Évaluation enquêterons.

Publié Date: 2010-07-22 01: 25: 56,0

Autres conseils

Je peux confirmer que le bug http://bugs.sun.com/ bugdatabase / view_bug.do? bug_id = 6815786 est toujours présent dans Oracle Java Windows 64 bits 1.6.0_35.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top