Мы начали с одной баночке с одним классом с одним из методов, как:Изменение только результат метода и загрузчик класса NoSuchMethod
boolean foo(int bar) { ... }
Однако результат этого метода было бесполезно (на самом деле, всегда верно), и клиенты, использовал этот результат, чтобы что-то не получилось с ошибкой. По этой причине метод был изменен на:
void foo(int bar) { ... }
и все детали перекомпилированы. Таким образом, мы можем взять на себя все пользователи этого банка вызывает метод, как:
foo(14);
никто не использует форму (и выходит за рамки данного вопроса, если есть кто-то):
boolean x = foo(14);
Предположим ни один клиент, новый или более старый, использует логический результат.
Проблема была в том, что в целевых системах, новая банка загружается без обновления клиентов. Не обновляемые клиенты терпят неудачу с исключением «NoSuchMethod» при поиске метода «foo» с результатом «boolean». То есть:
- У клиента есть статут типа "foo (14);" без использования результата метода
- клиент скомпилирован с использованием jar с булевым методом.
- клиента и библиотека загружаются в целевой системе
- библиотеки обновляются с новой баночкой с ничтожным методом
- клиентских аварий с «NoSuchMethod»
Происхождения проблемы, кажется, что оба, Java, и C/C++ не допускает, чтобы два метода отличались только результатом, но только Java «name mangling» включает в себя тип результата в имени, которое ищет загрузчик классов (компоновщик в C/C++).
Вопрос: можно ли каким-либо образом обмануть библиотеку или загрузчик классов, чтобы пропустить исключение «NoSuchMethod» в этом сценарии?
Да, это как вы описали, но ваше предложение решить текущую реальную проблему? –
Вы не можете решить проблему, не сохраняя старую подпись метода или перекомпилируя код клиента. – Andremoniy
К сожалению, я не могу «сохранить» более старый метод и более новый, потому что Java не позволяет использовать два метода только в типе результата. –