Любой байт-код Java, прошедший через обфускатор, будет иметь «нелепый» вывод из декомпилятора. Кроме того, если у вас есть другие языки, такие как Scala, которые компилируются в байт-код JVM, нет правила, что байт-код можно легко представить обратно в Java и, скорее всего, нет.
Со временем декомпиляторы должны не отставать от новых языковых функций и создаваемого ими байтового кода, поэтому вполне вероятно, что новые языковые функции не могут быть легко изменены теми инструментами, которые вы используете.
Редактировать: в качестве примера в .NET, следующий код:
lock (this)
{
DoSomething();
}
компилируется в это:
Monitor.Enter(this);
try
{
DoSomething();
}
catch
{
Monitor.Exit(this);
}
Декомпилятор должен знать, что C # (в отличие от любого другого языка .NET) имеет специальный синтаксис, предназначенный именно для этих двух вызовов. В противном случае вы получите неожиданные (подробные) результаты.