Согласно http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 , Class.getDeclaredMethods () должен включать только методы, «объявленные классом». Тем не менее, я получаю довольно удивительные результаты с тестовым кодом, приведенным ниже:
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()));
}
}
Несколько вещей, которые кажутся мне довольно странными / удивительными:
Компилятор жалуется на то, что B.m3 () имеет несовместимый тип возврата с A. м3 (). Это продиктовано JSL 8.4.8.3 (стр. 225 v3 langspec-3.0.pdf). Но мне любопытно, почему это ограничение нужно применять к статическим методам. Насколько я понимаю, статические методы можно скрыть, но не переопределить, и что ссылка разрешается во время компиляции, так какова причина этого ограничения?
В вывод включены два метода m2 (). Это, похоже, противоречит утверждению, что getDeclaredMethods () возвращает только методы, «объявленные классом», и «исключает унаследованные методы». Я не вижу A.m2 () как «объявленный» B.
Один m1 () включен в вывод. Следуя предыдущему пункту, если имеет смысл позволить getDeclaredMethods () возвращать два m2 (), почему он также не возвращает два m1 ()? В конце концов, это два разных метода, и один скрыт за другим. Я не Не видите ли принципиальной разницы между случаями m1 () и m2 (), за исключением того, что тип возвращаемого значения такой же в случае m1 (), но тип возврата, как я понимаю, не является частью сигнатуры метода?
Спасибо заранее!