При написании простого сериализатора JSON, использующего отражение в Java, я был застигнут врасплох поведением Class.getMethods (). Похоже, что Java Class.getMethods () возвращает как переопределенные, так и переопределенные методы, если возвращаемый тип переопределенного метода расширяет тип возвращаемого значения переопределенного метода.
Так, например, учитывая интерфейсы:
static interface A {
A x();
A y();
}
static interface B extends A {
B x();
A y();
}
A.class.getMethods()
возвращает и массив двух методов, как и ожидалось
однако B.class.getMethods()
возвращает массив из 3 методов (что для меня было немного противоречивым).
Из 3 1 соответствует y()
, как и ожидалось, но остальные два соответствуют исходному x()
с типом возврата A
и переопределяющей версии x()
с типом возврата B
соответственно. Это показалось мне немного странным, но иметь в исходном тексте x()
, поскольку он нигде не доступен. В любом случае, мой вопрос таков:
Существует ли простой способ получить список только самых специализированных версий методов класса, не прибегая к ручной проверке переопределенных методов и их фильтрации?