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-переходы, интересно проверяются ли они каким-либо образом?
Безусловно полезная статья для понимания принципов работы среды и компилятора, но она также полезна и злоумышленникам.
Это я к тому, а сможет ли злоумышленник изменить байт-код и при этом он пройдет все проверки? Или цифровая подпись спасает?
Какие параметры байт-кода проверяются?
В примерах видны goto-переходы, интересно проверяются ли они каким-либо образом?
Безусловно полезная статья для понимания принципов работы среды и компилятора, но она также полезна и злоумышленникам.
Это я к тому, а сможет ли злоумышленник изменить байт-код и при этом он пройдет все проверки? Или цифровая подпись спасает?
Ссылка на оригинальную статью Java Bytecode Fundamentals: arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html
Sign up to leave a comment.
Java Bytecode Fundamentals