Вопрос

В соответствии с 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top