Posso ottenere informazioni sulle variabili locali usando la riflessione Java?

Ho bisogno di sapere il tipo delle variabili locali. Sto usando Java reflection, con cui non ho potuto ottenerlo. Per favore fammi sapere come conoscere il tipo / nome delle variabili locali.

Posso ottenere informazioni sulle variabili locali usando la riflessione Java?

Supponendo che si stia parlando di un metodo o di variabili locali del costruttore, non è ansible conoscerli utilizzando la reflection. Devi o

  • utilizzare una libreria bytecode come BCEL o ASM o
  • utilizzare una delle API del debugger remoto.

Quest’ultimo ti permetterà di accedere ai valori delle variabili locali, ma solo mentre la JVM è sospesa dall’agent di debug.

Entrambi questi approcci si basano sulle classi in questione compilate con informazioni di debug. Nello specifico, le classi devono essere compilate con “informazioni di debugging delle variabili locali”; ad es. usando javac -g ... Le informazioni di debug di “vars” non sono incluse per impostazione predefinita.

In una parola, non puoi. I nomi delle variabili locali non sono preservati dal compilatore.

Come esperimento veloce, ho compilato la seguente class utilizzando Java 6 e le opzioni di compilazione predefinite:

 public class X { public static void main(String[] args) { int var = 2; System.out.println(var); } } 

Un rapido esame del file .class risultante rivela che il nome della variabile locale ( var ) non ce l’ha fatta lì.

No, non è ansible con Java Reflection. Cose come i nomi delle variabili locali vengono solitamente rimosse dal compilatore per fornire qualche offuscamento e ottimizzare lo spazio. C’è una libreria di codici byte ASM che può ispezionare lo stato delle cose in fase di runtime, che può essere utile a voi.

Se le mie variabili locali vuoi dire variabili di istanza e variabili di class, ecco come andresti:

 String s = new String("This is a sample"); Class type = s.getClass(); for ( Field f : type.getFields() ) { System.out.printf("Field %s is of type %s%n", f.getName(), f.getType().getName()); } 

Se ciò che intendi è una variabile locale per metodi / costruttori , non puoi accedervi con la riflessione.

Puoi accedere alla mappa delle variabili locali utilizzando le librerie di reverse engineering del codice bytecode come ASM . Si noti tuttavia che il nome delle variabili locali potrebbe non essere sempre presente nel bytecode, ma il numero e i tipi saranno sempre presenti.

Non c’è modo di ottenere queste informazioni tramite la riflessione. Reflection funziona a livello di metodo, mentre le variabili locali sono a livello di blocco di codice.