В пуле констант в файле .class есть структура "NameAndType".
Используется для динамического связывания.
Все методы, которые этот класс может «экспортировать», описаны как «сигнатура + тип возврата».
Нравится
"getVector()Ljava/util/Vector;"
Это нарушает мой код, когда тип возвращаемого значения метода в некотором .jar изменяется, даже если новый тип уже.
т.е:
У меня есть следующий код:
List l = some.getList();
Внешний .jar содержит:
public List getList()
Чем внешний jar меняет подпись метода на
public ArrayList getList().
И мой код умирает во время выполнения с NoSuchMethodException, потому что он не может найти
getList()Ljava/util/List;
Итак, мне нужно перекомпилировать мой код.
Я не должен менять это. Просто перекомпилируйте абсолютно одинаковый код!
Это также дает возможность иметь два метода с одной подписью, но с разными типами возврата! Компилятор не примет это, но это можно сделать с помощью прямого кодирования.
Мои вопросы Почему ?
Почему они это сделали?
У меня есть только одна идея: предотвратить сложную проверку типов во время выполнения.
Вы должны взглянуть на иерархию и проверить, есть ли родительский элемент с интерфейсом List.
Это требует времени, и только у компилятора. JVM нет.
Я прав?
спасибо.