Получение локальных переменных из фрейма стека в JVM
Вопрос
Есть ли какой-либо способ получить карту или другую структуру данных локальных переменных в текущей области видимости в JVM без использования отладчика?То есть, чтобы получить локальные данные текущего фрейма стека?
Я знаю, что существуют объекты stacktrace, но StackTraceElement
не имеет возможности получить доступ к какому-либо состоянию.Он просто сообщает вам, какой метод где был вызван, но не что в нем было.
Решение
Имена переменных могут быть включены в файлы классов, чтобы помочь отладчикам, но javac
не делает этого по умолчанию.Это требует -g:vars
вариант.
Если он присутствует, программа может использовать библиотеку разработки байт-кода, например КАК М для доступа к именам и области локальных переменных.
Пока этот вопрос плохо сформулирован, я думаю, что это дубликат, и его ответы могут иметь отношение к вашей проблеме.Я бы добавил, что если вас не волнуют имена, тип и область видимости локальной переменной всегда включаются в таблицу атрибутов каждого метода.
Другие советы
Я не думаю, что есть способ сделать это.Компилятор всегда волен оптимизировать локальные переменные, и предоставление такого метода помешало бы компилятору воспользоваться преимуществами этого типа оптимизации.При компиляции метода компилятор не сможет определить, вызвали ли вы гипотетический getLocalVariables()
где-то в другом месте программы, поэтому ей пришлось бы всегда помещать все объявленные локальные переменные в такую карту.