Как редактировать файлы классов Java

Обновлено: 04.07.2024

Файл класса Java – это файл, содержащий байт-код Java и имеющий расширение .class, который может выполняться JVM. Файл класса Java создается компилятором Java из файлов .java в результате успешной компиляции. Поскольку мы знаем, что один исходный файл языка программирования Java (или, можно сказать, файл .java) может содержать один класс или более одного класса. Таким образом, если файл .java содержит более одного класса, каждый класс будет скомпилирован в отдельные файлы классов.
Например: сохраните приведенный ниже код как Test.java в вашей системе.

Для компиляции:

  • Sample.class
  • Student.class
  • Тест.класс

Одна структура файла класса содержит атрибуты, описывающие файл класса.
Представление структуры файла класса

    magic_number: первые 4 байта файла класса называются magic_number. Это предопределенное значение, которое JVM использует для определения того, создан ли файл .class допустимым компилятором или нет. Предопределенное значение будет в шестнадцатеричной форме, то есть 0xCAFEBABE.
    Теперь давайте посмотрим, что произойдет, если JVM не найдет действительное магическое число. Предположим, у нас есть файл .java с именем Sample.java, как показано ниже, и следуем пошаговому процессу в вашей системе.

Шаг 1. Скомпилируйте с помощью javac Sample.java
Шаг 2. Теперь откройте файл Sample.class. Это будет выглядеть следующим образом.

Sample.class File< бр />

 Исключение во время выполнения из-за недопустимого магического числа

Шаг 3. Теперь удалите хотя бы один символ из этого файла Sample.class с начала файла и сохраните его.
Шаг 4. Теперь попробуйте запустить это с помощью команды java Sample и увидеть волшебство, т.е. вы получите исключение во время выполнения (см. выделенный текст на изображении ниже):

Примечание. Это зависит от того, насколько вы удалили данные из файла .class.

Примечание. Файл .class, сгенерированный компилятором более ранней версии, может быть выполнен JVM старшей версии, но файл .class, сгенерированный компилятором более высокой версии, не может быть выполнен JVM более ранней версии. Если мы попытаемся выполнить, мы получим исключение времени выполнения.

Эта демонстрация предназначена для ОС Windows следующим образом:

Шаг 1. Откройте окно командной строки и попробуйте проверить версию компилятора Java и версию JVM, используя следующие команды соответственно (команды выделены на изображении)
Вывод для версии 1.8 будет следующим:
< бр />

Шаг 2: Теперь проверьте другую версию, которая может быть выше или ниже уже установленной. Эта ссылка для загрузки.
И установите ее на свой ПК или ноутбук и запишите адрес установки.
Шаг 3: Откройте второе окно командной строки и укажите путь к папке bin установленного jdk, установленного во время 2-го шага. И проверьте версию компилятора Java и версию JVM.

Шаг 4. Теперь в первой командной строке скомпилируйте любой действительный файл .java. Например: см. выше файл Sample.java. Скомпилируйте его как:

Шаг 5. Теперь во втором окне командной строки попробуйте запустить указанный выше файл класса скомпилированного кода и посмотрите, что произойдет. Существует исключение во время выполнения, которое я выделил на изображении ниже.

Я хочу изменить метод файла .class. Я установил JD Eclipse Decompiler и открыл файл .class. Я добавил несколько кодов и сохранил файл .class. Но файл .class не меняется.

Я не умею пользоваться декомпилятором. И если возможно, как изменить файл .class без использования декомпилятора.

Я использую Ubuntu.

Вот мой декомпилированный код:

Поскольку класс idgenerator не поддерживает BigDecimal. Я использую Hibernate и PostgreSQL и получаю эту ошибку: этот генератор идентификаторов генерирует длинные, целые, короткие или строки

Использовать декомпилятор в 100 раз проще, чем альтернативы. Если идея использования декомпилятора покажется вам слишком сложной, я бы попробовал другой подход, не связанный с изменением класса.

10 ответов 10

Чтобы изменить класс Java, выполните следующие действия:

  1. Декомпилируйте файл .class, как вы сделали, и сохраните его как .java.
  2. Создайте проект в Eclipse с этим java-файлом, исходным JAR-файлом как библиотекой и всеми его зависимостями.
  3. Измените .java и скомпилируйте
  4. Получите измененный файл .class и снова поместите его в исходный JAR-файл.

Я не могу сохранить файл .java. На самом деле, я не могу сохранить в любом случае. Я сохранил файл .class, но когда я закрываю и снова открываю, мои изменения исчезают.

Не лучше ли загрузить исходный код файла, который вы хотите изменить (поскольку он является частью Hibernate), изменить его и перекомпилировать?Вы можете использовать мой метод для перекомпиляции или просто попробовать перекомпилировать весь Hibernate (хотя это может быть сложнее).

Тогда у вас есть это. Просто сохраните его в файл Java, добавьте изменения в форум и делайте то, что я предложил.

Вы забыли еще об одном варианте. Разобрать, модифицировать и собрать заново. Он работает с любым файлом класса, но требует от вас понимания байт-кода, в чем я очень сомневаюсь, что OP делает.

Используйте редактор байт-кода, например:

Будьте осторожны, потому что вам нужно очень хорошо знать байт-код Java.

Вы также можете изменить класс во время выполнения с помощью объединения байт-кода (например, AspectJ).

Я не думаю, что вы можете изменить какой-либо класс во время выполнения с помощью отражения. Вам нужна библиотека для создания классов на лету, чтобы сделать что-то подобное.

Иногда изменить байт-код Java проще, чем правильно установить зависимости. Особенно, если вам просто нужно внести некоторые незначительные изменения. В моем случае JBE выдавал ошибки, но Recaf работал отлично.

Я добавил несколько кодов и сохранил файл .class.

То, что вы видите в декомпиляторе JD EClipse, представляет собой декомпилированное представление байтового кода в файле .class. Даже если вы измените текст, это не повлияет на байт-код.

@BreedHansen, почему бы не сгенерировать String вместо BigDecimal? Итак, ответ на ваш вопрос: это почти невозможно. Или вам нужно извлечь исходный код для eclipse и попытаться сгенерировать другой файл класса с вашими изменениями.

Recaf — это графический интерфейс декомпилятора, который позволяет редактировать и перекомпилировать файлы. Вот соответствующая часть руководства:

Самый простой способ редактировать байт-код — это редактировать его как декомпилированный исходный код. Это не работает для очень сложных случаев и запутывания, но для большинства простых правок это все, что вам когда-либо понадобится. Просто откройте курс, внесите изменения в виде простого кода Java и сохраните его.

А на случай, если декомпилированный код не перекомпилируется, есть основная функция редактирования, ассемблер: coley.software/Recaf-documentation/use-edit-via-bytecode.html

когда вы декомпилируете и изменяете код, вы должны перейти в корневую папку вашего проекта eclipse и проверить свой класс в папке bin, которая находится на том же уровне, что и src. затем откройте оригинальную банку с помощью zip-инструмента (7zip подходит для этого) и поместите измененный класс в тот же пакет внутри банки.

Используйте библиотеку Java для управления байт-кодом Java (файл .class) приложения.

-> Spring , Hibernate , EJB, использующие это для реализации прокси

-> мы можем манипулировать байт-кодом, чтобы выполнить некоторый анализ программы

-> мы можем использовать Javassist для реализации прозрачного кеша для возвращаемых значений метода, перехватывая все вызовы метода и делегируя полномочия суперреализации только при первом вызове.

Вы можете использовать любой декомпилятор, чтобы сначала декомпилировать файл.

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

Извлек файл класса из jar

Открыл его в декомпиляторе (я использую JD GUI, вы можете легко получить его из многих ресурсов в Интернете). Вы можете скачать его здесь

Вы можете просмотреть все файлы в банке с помощью графического интерфейса JD.

Вы можете изменить код при его декомпиляции, но его необходимо перекомпилировать в файл класса, декомпилятор выводит код Java, который необходимо перекомпилировать с тем же путем к классам, что и исходный файл jar/класса

загружать декомпилированный код в eclipse, разрешать зависимости, исправлять ошибки и перекомпилировать с помощью eclipse. поместите полученный файл класса в старую банку. в качестве альтернативы получите исходный код.

Я могу получить доступ к файлу .java файла .class только в Eclipse. Итак, я не понял, как "файл класса в старую банку"?

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

Насколько мне удалось выяснить, простого способа сделать это не существует. Самый простой способ — фактически не преобразовывать файл класса в исполняемый файл, а обернуть исполняемый модуль запуска вокруг файла класса. То есть создайте исполняемый файл (возможно, исполняемый файл сценария на основе ОС), который просто вызывает класс Java через командную строку.

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


Я пытаюсь отредактировать файл .class для игры.Я скачал jd-gui, который позволил мне просмотреть код, и попытался скопировать код на один из этих сайтов онлайн-компиляторов, чтобы скомпилировать его. Но все онлайн-сайты не могут его скомпилировать:

/ItemWeaponFemur.java:2: ошибка: не удается найти символ, расширяющий Кодекс ^

Я запутался, что мне нужно, чтобы отредактировать файл .class? Я просто делаю несколько изменений в коде. Поэтому я подумал, что все, что мне нужно, это декомпилятор, чтобы декомпилировать код, внести изменения, а затем скомпилировать его снова, но онлайн-компиляторы, похоже, не могут его скомпилировать.

Итак, что мне нужно для правильной компиляции?


Код жалуется, что не может найти класс Codex. Скорее всего, вам потребуется декомпилировать и перекомпилировать весь исходный код (или, по крайней мере, все зависимости файла .class), а не только один файл .class.

Странно, но в документации об этом ничего не сказано. Я просто пытаюсь изменить один единственный файл .class.

Вот что говорится в документации (немного):

Codex — это скриптовый язык движка на основе Java. Он широко используется в игре для таких вещей, как дисциплины, заскриптованные последовательности, двери и другие движущиеся объекты и т. д. Эта версия документации является неполной и будет обновлена ​​в будущем выпуске инструментов. Однако приведенной информации должно быть более чем достаточно, чтобы начать работу.

Чтобы компилировать и использовать скрипты Codex, вам понадобится какой-либо компилятор Java. Большинство сценариев изначально были написаны в среде Microsoft Visual J++, однако они также были скомпилированы и протестированы с помощью Sun JDK 1.1.8. Этот компилятор находится в свободном доступе по адресу:

Я скачал JDK, но это всего лишь какая-то штука для управления полетами Java, и я не вижу ничего похожего на декомпилятор или компилятор.

Visual Studio Code — это прежде всего редактор исходного кода с широкими возможностями редактирования. В этом документе мы рассмотрим несколько специфичных для Java функций, полезных при работе с Java.

Если у вас возникнут проблемы при использовании перечисленных ниже функций, вы можете связаться с нами, указав проблему.

Навигация по коду

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

Поиск символов

Вы можете искать символы в текущем файле или рабочей области, чтобы быстрее перемещаться по коду.

Поиск символов в рабочей области

Поиск символов в текущем файле

Чтобы найти символ в текущем файле, используйте Быстрое открытие ( ⌘P (Windows, Linux Ctrl+P ) ), затем введите команду '@', затем введите имя искомого символа. Появится список потенциальных совпадений, который будет отфильтрован по мере ввода. Выберите из списка совпадений, чтобы перейти к его расположению.

Просмотр определения

Вы можете быстро просмотреть, как был определен символ, используя функцию Peek Definition. Эта функция отображает несколько строк кода рядом с определением внутри окна просмотра, так что вы можете посмотреть, не покидая своего текущего местоположения.

Чтобы просмотреть определение символа, поместите курсор на символ в любом месте, где он используется в исходном коде, а затем нажмите ⌥F12 (Windows Alt+F12 , Linux Ctrl+Shift+F10 ) . Кроме того, вы можете выбрать «Просмотр определения» в контекстном меню (щелкните правой кнопкой мыши и выберите «Просмотр определения»).

Перейти к определению

Вы также можете быстро перейти к месту определения символа с помощью функции "Перейти к определению".

Чтобы перейти к определению символа, поместите курсор на символ в любом месте, где он используется в исходном коде, а затем нажмите F12 . Кроме того, вы можете выбрать «Перейти к определению» из контекстного меню (щелкните правой кнопкой мыши, затем выберите «Перейти к определению»). Если имеется только одно определение символа, вы перейдете непосредственно к его местоположению, в противном случае конкурирующие определения отображаются в окне просмотра, как описано в предыдущем разделе, и вам нужно выбрать определение, к которому вы хотите перейти.

Перейти к суперреализации

Вы можете отслеживать реализации классов и методы переопределения, щелкнув ссылку Перейти к суперреализации при наведении указателя мыши.

Spring Navigation< бр />

Иерархия вызовов

В представлении "Иерархия вызовов" отображаются все вызовы от функции или к ней, а также вы можете детализировать вызывающие абоненты и вызовы вызовов. Щелкните правой кнопкой мыши функцию и выберите Просмотр > Просмотр иерархии вызовов.

Просмотр иерархии вызовов

Вы также можете щелкнуть правой кнопкой мыши тело функции и выбрать "Показать иерархию вызовов".

Иерархия типов

Представление иерархии типов показывает отношения наследования между объектами Java. Вы можете щелкнуть правой кнопкой мыши тип и выбрать Показать иерархию типов.

Области сворачивания

Области сворачивания позволяют сворачивать или разворачивать фрагмент кода для лучшего просмотра исходного кода.

Умный выбор

С помощью интеллектуального выбора (семантического выбора) вы можете расширить или сузить диапазон выбора на основе семантической информации о позиции курсора в исходном коде.

  • Чтобы расширить выделение, используйте ⌃⇧⌘→ (Windows, Linux Shift+Alt+Right ).
  • Чтобы уменьшить выделение, используйте ⌃⇧⌘ ← (Windows, Linux Shift+Alt+Left ) .

Семантическое выделение

Подсветка синтаксиса – важная функция, которая позволяет более эффективно читать код. С помощью семантического выделения VS Code может обеспечить более точное выделение цветом исходного кода на основе информации о символах из языковой службы Java.

Ниже приведен только один пример: слева показано поведение после включения семантической подсветки, а справа — только с подсветкой синтаксиса.

Semantic Highlighting< бр />

Подробнее о подсветке семантики Java можно узнать на вики-сайте расширения поддержки языка Java.

Навигация по коду с помощью Spring Boot

Расширение Spring Boot Tools обеспечивает улучшенную навигацию и поддержку завершения кода для проектов Spring Boot.

  • @/ показывает все определенные сопоставления запросов (сопоставленный путь, метод запроса, исходное местоположение)
  • @+ показывает все определенные bean-компоненты (имя bean-компонента, тип bean-компонента, исходное расположение)
  • @> показывает все функции (реализация прототипа)
  • @ показывает все аннотации Spring в коде

Spring Navigation< бр />

Чтобы узнать больше о поддержке Spring Boot в Visual Studio Code, прочитайте Spring Boot в Visual Studio Code.

Редактирование кода

Редактировать код также легко с помощью IntelliSense для интеллектуального завершения кода и сведений о подписи. Вы можете использовать фрагменты кода, а также различные действия с кодом, такие как создание геттеров и сеттеров и организация импорта, чтобы еще больше повысить свою производительность.

Поддержка Java в Visual Studio Code автоматически обнаруживает проблемы в вашем коде и предоставляет вам рекомендации по быстрому исправлению.

Подробнее о рефакторинге и действиях с кодом см. в разделе Рефакторинг и действия с исходным кодом.

IntelliSense

Автозавершение кода в Visual Studio Code for Java обеспечивается языковой поддержкой для Java™ от Red Hat. Расширение основано на тех же инструментах разработки Java (JDT), что и Eclipse, поэтому вы можете рассчитывать на такой же уровень поддержки.

Кроме того, существует технология IntelliSense с искусственным интеллектом, которая называется IntelliCode. Это экономит ваше время, помещая то, что вы, скорее всего, будете использовать, в начало списка завершения. Рекомендации IntelliCode основаны на тысячах проектов с открытым исходным кодом на GitHub, каждый из которых имеет более 100 звезд, поэтому он обучен наиболее распространенным применениям из высококачественных проектов. В сочетании с контекстом вашего кода список завершения адаптирован для продвижения этих практик. Вот IntelliCode для Java в действии.

IntelliCode хорошо работает с популярными библиотеками и платформами Java, такими как Java SE и Spring. Это поможет вам независимо от того, создаете ли вы монолитные веб-приложения или современные микросервисы.

Создать новый файл

VS Code поддерживает применение шаблонов при создании исходного файла Java. Когда вы создаете файл .java в проводнике, языковой сервер автоматически генерирует тело класса и заполняет для вас информацию о пакете:

Фрагменты кода

Visual Studio Code поддерживает широкий спектр популярных фрагментов кода Java, чтобы повысить вашу продуктивность, например class/interface, syserr, sysout, if/else, try/catch, статический метод main. Используя информацию с языкового сервера Java, он также обеспечивает предварительный просмотр фрагмента кода во время выбора.

Читайте также: