7 votes

getDeclaredMethods() et la méthode statique cachée de la super classe

Selon http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 Class.getDeclaredMethods() ne devrait inclure que les méthodes "déclarées par la classe". Cependant, j'obtiens 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 éléments qui me semblent assez étranges/surprenants :

  • Le compilateur se plaint que B.m3() a un type de retour incompatible avec A.m3(). Ceci est dicté par la JSL 8.4.8.3 (Page 225 v3 langspec-3.0.pdf). Mais je suis curieux de savoir pourquoi cette restriction doit s'appliquer aux méthodes statiques. Si je comprends bien, les méthodes statiques peuvent être cachées et non surchargées, et la référence est résolue au moment de la compilation, alors quel est le raisonnement derrière cette restriction ?

  • Deux méthodes m2() sont incluses dans la sortie. Cela semble contredire l'affirmation selon laquelle getDeclaredMethods() ne renvoie que les méthodes "déclarées 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. Suivant le point précédent, s'il était logique de laisser getDeclaredMethods() retourner deux m2(), pourquoi ne retourne-t-il pas aussi deux m1() ? Après tout, ce sont deux méthodes distinctes, et l'une est cachée par l'autre. Je ne vois pas de différence fondamentale entre les cas de m1() et m2(), à l'exception du type de retour qui est le même dans le cas de m1(), mais le type de retour, comme je le comprends, ne fait pas partie de la signature de la méthode ?

Merci d'avance !

3voto

Gary Gregory Points 345

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-bit 1.6.0_35.

2voto

Puspendu Banerjee Points 1946

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

Bien qu'il ait été signalé contre 1.6.0_12-b04 le 2009-03-11 05:44:57.0 mais Sun l'a accepté le 2010-07-22 01:25:56.0

en bref :

Synopsis (reflect) Class.getDeclaredMethods() retourne les méthodes héritées.

Catégorie java:classes_lang

Signalé Contre

État 3-Accepté, bug

Priorité : 3-Moyen

Date de soumission 11-MAR-2009

Travailler autour N/A

Évaluation Nous allons enquêter.

Date d'affichage : 2010-07-22 01:25:56.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X