2009-08-31 15 views
8

¿Hay alguna manera de obtener un mapa u otra estructura de datos de las variables locales en el ámbito actual en la JVM sin usar un depurador? Es decir, ¿para obtener los locales del marco de pila actual?Obteniendo variables locales desde un marco de pila en la JVM

Sé que hay objetos stacktrace, pero StackTraceElement no tiene forma de acceder a ningún estado. Simplemente te dice qué método se llamó dónde, pero no qué contenía.

Respuesta

4

Los nombres de las variables se pueden incluir en los archivos de clase para ayudar a los depuradores, pero javac no lo hace de forma predeterminada. Requiere la opción -g:vars.

Si está presente, un programa podría usar una biblioteca de ingeniería de código de bytes como ASM para acceder a los nombres y el ámbito de las variables locales.

Aunque this question está mal redactado, creo que es un duplicado, y sus respuestas pueden ser relevantes para su problema. Yo agregaría que si no te importan los nombres, el tipo de variable local y el alcance siempre se incluyen en la tabla de atributos de cada método.

1

No creo que haya una manera de hacer esto. El compilador siempre puede optimizar las variables locales alejadas, y proporcionar dicho método evitaría que el compilador aproveche este tipo de optimización. Al compilar un método, el compilador no podría decir si llamó a un hipotético getLocalVariables() en algún otro lugar del programa, por lo que tendría que poner siempre todas las variables locales declaradas en dicho mapa.

+0

Las variables locales están disponibles en un mapa en StackFrame. Puedes echar un vistazo aquí https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –

Cuestiones relacionadas