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