Именно полностью оригинальный код не получится(если конечно не включены все дебагсимволы). Код восстановится до конструкций похожих т.е.:
условно говоря кострукции
for(int i:0;i<100;i++){}
или
for(Object o: objects){}
и еще тонна вариантов
В байткоде будет иметь одинаковый вид(не принимайте наслово но это образно говоря). А значит декомпилятор увидит подобный байткод и восстановит конструкцию именно ту которую посчитает наиболее удобной но не ту которая была в оригинале.
Аналогично с остальными случаями, констанатами,функциями,классами.
Кроме того не будут учитываться еще тонны тонкостей, взять хотя бы аннотации.
Т.е. в целом код будет читабелен, скорее всего но не факт компилируем, вероятно что рабочим но с глюками которых не было в оригинале.
В общем все напрямую зависит от компилятора, стиля кода, используемых фич которые что то делают именно на этапе компиляции, сахара библиотек и языка.
В том же с\с++ можно декомпилировать до асемблера а затем восстановить уже его до С, который также вполне читабелен и местами рабочий. Если есть дебаг символы то еще и тонны других вещей восстановится (имена констант\переменных\функций\коментариев).
Короче все очень относительно но в целом java код даже скомпиленный с оптимизациями намного более читабелен но это связанно с особенностями работы и самих бинарных файлов.