У Java ByteCode есть "косвенный переход"?

Если я не ошибся, кажется, что весь поток управления байт-кодом в Java

лайк

ifeq
goto

и другие инструкции прямого прыжка.

мои вопросы, есть ли какие-либо инструкции "косвенного перехода" в Java?

И если нет, то как я могу имитировать "косвенный переход" в Java с помощью кода JavaByte, как в сборке, мы можем сделать это:

goto address;  // we can only know address at runtime

Спасибо

------------------Обновить--------------------------

По сути, я пытаюсь изменить поток управления во время выполнения, но поскольку назначение байт-кода потока управления жестко закодировано при компиляции, это кажется невозможным.

3 ответа

Решение

Косвенный переход не сможет выполнить проверку байт-кода. Прочтите о том, как проверяются файлы классов (в спецификации JVM), и вы поймете, почему.

В частности, следующее было бы невозможно проверить:

  • Целью всех команд потока управления должен быть запуск инструкции (без перехода в середину инструкции)

  • Стек должен быть согласованным (одинаковой высоты и типов значений) в конкретной инструкции, независимо от того, как ВМ достигла этой точки.

РЕДАКТИРОВАТЬ: Полностью принял вопрос неправильно. (Увидеть ниже)

Поддержка JVM goto на уровне байт-кода. Вам просто нужны библиотеки, такие как

BCEL


Оригинальный ответ, на goto в исходном коде:

Первоначально Java имел операторы goto, но в более поздних версиях его не было. Я думаю, что возможная причина может быть goto является ненужным, и его можно заменить более читаемыми утверждениями

Ключевое слово goto существует, но оно не реализовано.

Посмотри это интересное видео Джеймса Гослинга

Любая форма вызова метода является "косвенным переходом" по вашему определению.

Другие вопросы по тегам