2009-08-31 18 views
8

C'è un modo per ottenere una mappa o un'altra struttura dati delle variabili locali nello scope corrente in JVM senza utilizzare un debugger? Cioè, per ottenere i locali del frame dello stack corrente?Come ottenere variabili locali da una cornice stack sulla JVM

So che ci sono oggetti stacktrace, ma StackTraceElement non ha modo di accedere a nessuno stato. Ti dice solo quale metodo è stato chiamato dove, ma non cosa contiene.

risposta

4

I nomi di variabili possono essere inclusi nei file di classe per aiutare i debugger, ma lo standard javac non lo fa per impostazione predefinita. Richiede l'opzione -g:vars.

Se è presente, un programma potrebbe utilizzare una libreria di ingegneria byte-code come ASM per accedere ai nomi e all'ambito delle variabili locali.

Mentre il this question non è formulato correttamente, penso che sia un duplicato e le sue risposte potrebbero essere rilevanti per il tuo problema. Vorrei aggiungere che se non ti interessa i nomi, il tipo di variabile locale e l'ambito sono sempre inclusi nella tabella degli attributi di ciascun metodo.

1

Non penso che ci sia un modo per farlo. Il compilatore è sempre libero di ottimizzare le variabili locali e fornire un tale metodo impedirebbe al compilatore di sfruttare questo tipo di ottimizzazione. Durante la compilazione di un metodo, il compilatore non sarebbe in grado di dire se hai chiamato un ipotetico getLocalVariables() da qualche altra parte nel programma, quindi dovrebbe sempre mettere tutte le variabili locali dichiarate in tale mappa.

+0

Le variabili locali sono disponibili in una mappa in StackFrame. Puoi dare un'occhiata qui https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –