[#] Как растаращить class-файл
habrabot(difrex,1) — All
2014-12-12 09:00:03


![][1]Обычно при компиляции Java-файла получаются .class-файлы примерно того же размера, что и исходник. Меня заинтересовало, можно ли по небольшому исходнику сделать .class-файл, который больше, сильно больше исходника. Можно поискать какие-то короткие конструкции языка, которые компилируются в длинные цепочки байткода, но линейный прирост меня не устраивал. Я сразу подумал про компиляцию finally-блоков: про неё уже [писали на Хабре][2]. Если вкратце, то для каждого finally-блока при непустом try-блоке создаётся минимум два варианта в байткоде: для случая нормального завершения try-блока и для случая завершения с исключением. В последнем случае исключение сохраняется в новую локальную переменную, выполняется код finally, затем исключение достаётся из локальной переменной и перебрасывается. А что если внутри finally снова разместить try-finally и так далее? Результат превзошёл все ожидания. [Читать дальше →][3]

[1]: //habrastorage.org/files/318/23d/27b/31823d27b8b6404386b1fb2811933e2d.gif
[2]: http://habrahabr.ru/post/212759/
[3]: http://habrahabr.ru/post/245333/#habracut