При написании простого сериализатора 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
и заменяющей версией. of x ()
с типом возврата B
соответственно. Мне показалось немного странным иметь в массиве только исходный x ()
, поскольку он недоступен из любого места. В любом случае, мой вопрос таков:
Существует ли простой способ получить список только наиболее специализированных версий методов класса, не прибегая к ручной проверке переопределенных методов и их фильтрации?