Pull to refresh

Comments 9

Интересно было рассмотреть, как реализуются в байт-коде замыкания
Как-как. Делается обычный класс. Даже не вложенный (потому что inner classes никак особо не поддерживаются в JVM, просто используется соглашение на именование класса и его полей). Переменные, которые замыкание вытаскивает из вышестоящего контекста, преобразуются в поля данного класса. Внутри замыкания при обращении к этим переменным реально вытягиваются значения полей. При создании замыкания после собственно создания экземпляра класса его полям дополнительно присваиваются значения переменных, выхваченных из контекста. Т.е. это даже не фича JVM.
Чуть ли не самое лучшее описание байткода JVM, которые я видел, содержится в документации по ASM (http://download.forge.objectweb.org/asm/asm-guide.pdf). Кстати, эта библиотека, на мой взгляд, на порядок лучше BCEL, особенно, если нужно просто сгенерить класс из пустого места (а не трансформировать имеющийся). Кроме того, в ASM есть свой валидатор байткода, поддерживающий все фичи последних JVM. В BCEL тоже есть, но там поддерживается только несколько устаревшная спецификация из The JavaTM Virtual Machine Specification. И код в BCEL генерить неудобно, особенно переходы вперёд по коду.

Кстати, никто не знает, почему более поздние версии байткода не задокументированы публично? Ведь это должно быть частью спецификации, а она, по идее, открыта.
Она открыта, где-то в недрах сайта можно найти все изменения и добавления ко второму изданию спецификации, но актуальной единой спецификации в виде книги просто нет. (могу ошибаться)
«ложит»
такая хорошая статья и так одним словом перечеркнулась :(
Не беда. Для этого есть ЛС.
Мне интересно как происходит проверка байт-кода на корректность(валидность). Сколько этапов и какие? При первой загрузке класса загрузчиком?
Какие параметры байт-кода проверяются?
В примерах видны goto-переходы, интересно проверяются ли они каким-либо образом?
Безусловно полезная статья для понимания принципов работы среды и компилятора, но она также полезна и злоумышленникам.
Это я к тому, а сможет ли злоумышленник изменить байт-код и при этом он пройдет все проверки? Или цифровая подпись спасает?
Sign up to leave a comment.

Articles