Почему отражение возвращает два метода, когда есть только одна реализация?
Предположим, что у меня есть этот код:
public interface Address {
public int getNo();
}
public interface User<T extends Address> {
public String getUsername();
public T getAddress();
}
public class AddressImpl implements Address {
private int no;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
}
public class UserImpl implements User<AddressImpl> {
private String username;
private AddressImpl addressImpl;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public AddressImpl getAddress() {
return addressImpl;
}
public void setAddress(AddressImpl addressImpl) {
this.addressImpl = addressImpl;
}
}
Запуск кода:
int getAddressMethodCount = 0;
for (Method method : UserImpl.class.getMethods()) {
if (method.getName().startsWith("getAddress")) {
getAddressMethodCount++;
}
}
даст 2 для переменной getAddressMethodCount
; почему это так?
Ответы
Ответ 1
Это способ реализации ковариантных типов возврата. javap -private
покажет вам более удобно, чем отражение.
В подклассе есть метод синтетического моста, который обрабатывает пересылку более конкретному методу. Поскольку JVM касается методов, у них есть имя, последовательность сырых типизированных параметров и возврат типа raw. Вы можете перегрузить тип возврата в байт-код.
A System.err.println(mehtod.getReturnType());
должен дать вам разные результаты для двух методов.