GetDeclaredMethods () и скрытый статический метод Super Class
-
28-09-2019 - |
Вопрос
В соответствии с http://download.orcle.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.M3 (). Это продиктовано JSL 8.4.8.3 (стр. 225 v3 langspec-3.0.pdf). Но мне интересно, почему это ограничение должно относиться к статическим методам. Мое понимание заключается в том, что статические методы могут быть скрыты и не перераспределены, и что эта ссылка разрешается во время компиляции, так что каковы рассуждения за этим ограничением?
2 метода M2 () включены в выходные данные. Похоже, что это противоречит утверждению, что GetDeclaredMethods () возвращает только методы «объявленные классом», а «исключает унаследованные методы». Я не вижу A.M2 () как «объявлено» B.
Один M1 () включен в вывод. После предыдущей точки, если именно имеет смысл позволять getDeclaredmethods () вернуть два м2 (), почему он не возвращает два м1 (), а также? Они после всех двух различных методов, и один скрыт другой. Я не вижу ни одной насложную разницу между корпусом M1 () и M2 (), за исключением того, что тип возврата, одинакового в случае M1 (), но тип возврата, который я понимаю, не является частью подписи метода?
Заранее спасибо!
Решение
Видеть http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786.
Хотя это было сообщено против 1.6.0_12-B04 на 2009-03-11 05: 44: 57.0 Но Солнце приняло его на 2010-07-22 01: 25: 56,0
вкратце:
Синопсис (отражать) Class.getDeclaredMethods () возвращает унаследованные методы
Категория Java: Classes_lang.
Сообщили Против
Состояние 3 - принято, ошибка
Приоритет: 3-меру
Отправить дату 11-Мар-2009
Работать вокруг N / A.
Оценка Будет расследовать.
Дата публикации : 2010-07-22 01:25:56.0
Другие советы
Я могу подтвердить, что ошибка http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786. Все еще присутствует в Oracle Java Windows 64-бит 1.6.0_35.