Меняется ли семантика проекта в байт-коде при изменении всех его модификаторов доступа на public? - PullRequest
0 голосов
/ 10 января 2019

Предполагается, что у меня есть исполняемый jar (A.jar) с файлами .class внутри. У меня также есть другой исполняемый файл jar (B.jar), аналогичный A.jar, за исключением модификаторов доступа, которые все изменены на public (как для полей, так и для методов). Есть ли шанс, что некоторые семантики изменены? Будет ли он (B.jar) работать точно так же, как и предыдущий (A.jar)? Какие опасности?

РЕДАКТИРОВАТЬ ПРИМЕР: A.jar содержит байт-код (файлы .class). Я анализирую его с помощью библиотеки asm и меняю все его модификаторы на public. Полученный jar - файл B.jar.

1 Ответ

0 голосов
/ 10 января 2019

Одним из возможных изменений поведения является то, что частные методы не могут переопределять методы в суперклассе. Это означает, что изменение метода подкласса на public может потенциально изменить метод, который вызывается во время выполнения из виртуальных вызовов.

Из JVM Spec v11 5.4.5

Метод экземпляра mC может переопределить другой метод экземпляра mA, если все верно следующее:

mC имеет то же имя и дескриптор, что и mA.

mC не помечен ACC_PRIVATE.

Верно одно из следующего:

мА обозначено ACC_PUBLIC.

мА помечено ACC_PROTECTED.

мА не отмечено ни ACC_PUBLIC, ни ACC_PROTECTED, ни ACC_PRIVATE, и либо (а) объявление мА появляется в том же пакете времени выполнения как объявление mC, или (b) если mA объявлено в классе A и mC объявлен в классе C, то существует метод mB, объявленный в класс B такой, что C является подклассом B, а B является подклассом A и mC может переопределить мБ и мБ может переопределить мА.

...