Прежде всего, вам не хватает одного шага в объяснении файла .jar.
Файл .jar
представляет собой набор файлов .class
. И .class
файлы - это то, что получается путем компиляции .java
файла.
Обычно один файл .java
создает один файл .class
, поскольку он содержит определение одного типа. Но есть несколько способов для файла .java
создать более одного .class
файла (внутренние / вложенные классы, анонимные классы, непубличные классы верхнего уровня, ...), поэтому это не обязательно обязательно связь 1-к-1 между .java
файлами и .class
файлами.
Тогда возникает путаница, почему декомпилированный исходный код Java выглядит сложнее, чем исходный исходный код Java. На этот вопрос легко ответить: шаг компиляции не был предназначен , чтобы быть обратимым.
Когда компилятор Java превращает файлы .java
в файлы .class
, он создает формат, который лучше всего подходит для выполнения. Этот формат не будет представлять собой те же понятия, что и исходный файл Java. Например: в байт-коде Java нет классического «если». Будет реализована соответствующая команда перехода.
Все это означает, что процесс преобразования .class
файлов обратно в .java
файлы сложен и, как правило, не совершенен.