Подтвердить что ты не робот

Какие компиляторы Java используют инструкцию jsr, и для чего?

Язык байт-кода Java имеет инструкцию JSR.

Ни один из кода, который я компилировал с помощью компилятора Java 7, не использует эту инструкцию.

Однако иногда используемые Java файлы, которые я загрузил, используют, хотя и редко.

Мне было бы интересно узнать, какие компиляторы используют эту инструкцию, и какие конструкторы кода Java заставят их использовать ее.

Изменить, это не дубликат, так как это относится к инструкции байт-кода JSR, а не к запросу спецификации Java

4b9b3361

Ответ 1

Инструкция JSR на самом деле даже не разрешена в Java 7 classfiles. Это разрешено только в версиях версии 49.0 или более ранних классов, соответствующих Java 5 или ранее. На практике он не использовался задолго до этого.

Механизм JSR/RET изначально использовался для реализации блоков finally. Тем не менее, они решили, что сэкономить размер кода не стоит дополнительной сложности, и он постепенно прекращается.

Я не знаю точных версий, так как я не могу найти компиляторы, которые были старыми, но на основе обсуждений, которые я нашел в Интернете, похоже, что переход произошел в эпоху Java 1.2-1.3, причем разные компиляторы переключались на разные раз. Я никогда не видел законного файла классов из одного из этих старых компиляторов, но вы никогда не знаете, когда это может произойти.

На практике единственное использование JSR, которое я видел в дикой природе, - это обфускация. Например, Zelix Klassmaster использовал его для своего строкового кода дешифрования. Я также использовал его в нескольких моих собственных трещинах Java.

Ответ 2

В соответствии со спецификацией JVM:

В Oracle, реализующей компилятор для языка программирования Java до Java SE 6, команда jsr использовалась с инструкцией ret при реализации предложения finally