2010-11-04 9 views
7

Selon Class 0get (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29), Class.getDeclaredMethods() doit uniquement inclure les méthodes "déclarées par la classe". Cependant, je reçois des résultats assez surprenants avec le code de test ci-dessous:getDeclaredMethods() et la méthode statique de la super classe masquée

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é par JSL 8.4.8.3 (page 225 v3 langspec-3.0.pdf). Mais je suis curieux, pourquoi cette restriction doit s'appliquer aux méthodes statiques. Ma compréhension est que les méthodes statiques peuvent être cachées et non remplacées, et que 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() renvoie uniquement 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é par" B.

  • Un m1() est inclus dans la sortie. En suivant le point précédent, s'il est logique de laisser getDeclaredMethods() retourner deux m2(), pourquoi ne renvoie-t-il pas deux m1() aussi? Ils sont après tout deux méthodes distinctes, et l'une est cachée par l'autre. Je ne vois aucune différence fondamentale entre le cas de m1() et m2() sauf que le 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 d'avance!

+0

Pour moi, un m2 est inclus dans la sortie (jdk_1.6.0_21). – axtavt

+0

J'ai deux m2() en utilisant jdk_1.6.0u18. Est-ce quelque chose qui s'est arrangé entre u18 et u21 alors? Y avait-il un ticket fixe pour cela si c'est le cas? thx – RAY

Répondre

2

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 accepté le 2010-07-22 01: 25: 56,0

en bref:

Synopsis (refléter) Class.getDeclaredMethods() est de retour méthodes héritées

Catégorie java: classes_lang

Rapporté contre

État 3 Accepté, bug

Priorité: 3-Medium

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

Contournement N/A

Évaluation Effectuer une recherche.

Date de publication: 2010-07-22 01:25:56.0

+0

"Va enquêter" ... – RAY

+0

: D C'est Effet Or-Acle! –

Questions connexes