Pregunta

Según http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 , Class.getDeclaredMethods () sólo deben incluir métodos "declarados por la clase". Sin embargo, estoy consiguiendo algunos bastante sorprendentes resultados con el código de prueba a continuación:

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

Algunas cosas que se parecen bastante extraño / sorprendente para mí:

  • El compilador se quejan de B.m3 () que tiene un tipo de retorno incompatible con A.m3 (). Esta es dictado por JSL 8.4.8.3 (página 225 v3 langspec-3.0.pdf). Pero tengo curiosidad, ¿por qué esta restricción tiene que aplicar a los métodos estáticos. Mi opinión es que los métodos estáticos se pueden ocultar y no anulado, y que la referencia se resuelve en tiempo de compilación, así que lo que es el razonamiento detrás de esta restricción?

  • Dos m2 () los métodos están incluidos en la salida. Esto parece contradecir la afirmación de que getDeclaredMethods () sólo devuelve métodos "declarados por la clase", y "excluye métodos heredados". No veo A.m2 () como "declarado por" B.

  • Uno m1 () se incluye en la salida. Tras el punto anterior, si tuviera sentido para dejar getDeclaredMethods () devuelven dos m2 (), ¿por qué no devolver dos m1 (), así? Después de todo son dos métodos distintos, y uno está oculto por el otro. No veo ninguna diferencia entre fundemental el caso de M1 () y M2 (), excepto el tipo de retorno es el mismo en el caso de M1 (), pero el tipo de retorno según entiendo no es parte de la firma del método

Gracias de antemano!

¿Fue útil?

Solución

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

A pesar de que se había informado en contra 1.6.0_12-b04 en 2009-03-11 05: 44: 57.0  pero Sun la aceptó el 2010-07-22 01: 25: 56.0

En resumen:

Sinopsis métodos Class.getDeclaredMethods (reflejar) () está volviendo heredadas

Categoría java: classes_lang

Informó contra

Estado 3-Aceptado, error

Prioridad: 3-Medium

Enviar más recientes 11-MAR-2009

Trabajo Alrededor N / A

Evaluación investigará.

Fecha de Publicación: 2010-07-22 01: 25: 56.0

Otros consejos

Me puede confirmar que el error http://bugs.sun.com/ bugdatabase / view_bug.do? bug_id = 6815786 todavía está presente en Oracle Java Windows de 64 bits 1.6.0_35.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top