getDeclaredMethods () et méthode statique super classe cachée
-
28-09-2019 - |
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!
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.