Posso obter informações sobre as variables ​​locais usando a reflection Java?

Eu preciso saber o tipo das variables ​​locais. Eu estou usando a reflection Java, usando o que eu não consegui. Por favor, deixe-me saber como saber o tipo / nome das variables ​​locais.

Posso obter informações sobre as variables ​​locais usando a reflection Java?

Supondo que você esteja falando sobre um método ou variables ​​locais do construtor, você não pode descobrir sobre eles usando reflection. Você tem que

  • usar uma biblioteca de bytecode como BCEL ou ASM, ou
  • use uma das APIs do depurador remoto.

O último permitirá que você acesse os valores das variables ​​locais, mas apenas enquanto a JVM estiver suspensa pelo agente de debugging.

Ambas as abordagens dependem das classs em questão serem compiladas com informações de debugging. Especificamente, as classs precisam ser compiladas com “informações de debugging de variables ​​locais”; por exemplo, usando javac -g ... As informações de debugging “vars” não são incluídas por padrão.

Em uma palavra, você não pode. Os nomes das variables ​​locais não são preservados pelo compilador.

Como um experimento rápido, compilei a seguinte class usando as opções do Java 6 e do compilador padrão:

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

Um exame rápido do arquivo .class resultante revela que o nome da variável local ( var ) não chegou lá.

Não, não é possível com o Java Reflection. Coisas como nomes de variables ​​locais geralmente são removidas pelo compilador para fornecer alguma ofuscação e otimizar o espaço. Existe uma biblioteca de códigos de bytes ASM que pode inspecionar o estado das coisas em tempo de execução, o que pode ser útil para você.

Se minhas variables ​​locais significam variables ​​de instância e variables ​​de class, aqui está como você iria:

 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 o que você quer dizer é variables ​​locais para methods / construtores , você não pode acessá-los com reflection.

Você pode obter access ao mapa de variables ​​locais usando bibliotecas de engenharia reversa de bytecode como o ASM . No entanto, observe que o nome das variables ​​locais nem sempre está presente no bytecode, mas o número e os tipos sempre estarão lá.

Não há como obter essa informação por meio da reflection. A reflection funciona no nível do método, enquanto as variables ​​locais estão no nível do bloco de código.