Могу ли я удалить значение enum из файла класса Java? - PullRequest
1 голос
/ 28 апреля 2019

Допустим, у меня есть файлы jar большого Java-приложения, но я не могу выполнить повторную генерацию из источника.Позволяет также указать, что я хочу изменить один из аспектов нежелательного поведения приложения, исключив значение enum, которое вызывает это.Могу ли я удалить одно из значений enum из соответствующего файла .class, воссоздать jar, к которому он принадлежит, и достичь цели по-прежнему работоспособного приложения?Как это можно сделать и каковы возможные недостатки?

Ответы, требующие использования только инструментов, доступных в JDK, предпочтительнее, чем дополнительные инструменты, такие как перечисленные в этого вопроса .Этот подобный вопрос был бы полезен, если бы у него были ответы.

Изменения в приложении для выполнения отражения, динамического манипулирования байт-кодом или изменения времени выполнения для значений перечисления ala этот вопрос не является начальным.

1 Ответ

2 голосов
/ 28 апреля 2019

Скорее всего: невозможно.

но я не могу сгенерировать заново из источника

Другими словами: вы не можете скомпилировать его как «проект». Таким образом, вам не хватает необходимого инструментария, который входит в такое определение проекта (например, простой доступ к «использованию» и простой рефакторинг).

Давайте на секунду предположим, что вам каким-то образом удалось скомпилировать этот один Java-файл Enum в файл класса. Конечно, когда это работает, вы можете войти, удалить соответствующую константу, построить новый файл .class и манипулировать существующим файлом JAR, чтобы использовать это.

Но большой минус: у вас есть нет представления о том, сколько других классов используют эту конкретную константу. Возможно, используя javap и grep и еще много чего, вы могли бы быть в состоянии идентифицировать использование этой константы. Но, увы, это не помогает. Потому что, зная, что в каком-то классе используется enum, E.y вовсе не говорит вам , как вам придется манипулировать этим классом, чтобы вы могли безопасно удалить E.y!

С другой стороны, вы предполагаете, что это изменение приведет к тому, что большое приложение каким-то образом избежит нежелательного поведения. Вывод: кажется, что этой константы очень много используют. Как вы думаете, что код должен делать потом в будущем? Конечно, переключение дел просто не выполняется. Но как насчет вызовов методов, которые передают вашу константу в качестве аргумента ?! И что еще хуже: как насчет «умных» людей, которые использовали метод ordinal() с этим конкретным перечислением или отражением (для создания констант перечисления из необработанных строк, исходящих от Бога, знает) ?!

Короче говоря: конечно, теоретически вы можете удалить константу перечисления легко. Но, скорее всего, в результате этого не будет работать надежно.

Вместо этого: шаг назад. Не смотрите на ваше приложение с точки зрения классов и констант. Подумайте о его функциях и модулях, и скорее определите, какие «целые компоненты» можно безопасно вырезать / заменять из / в этой системы.

...