Могу ли я получить информацию о локальных переменных, используя отражение Java? - PullRequest
18 голосов
/ 25 июля 2011

Мне нужно знать тип локальных переменных.Я использую отражение Java, используя который я не смог получить его.Пожалуйста, дайте мне знать, как узнать тип / имя локальных переменных.

Могу ли я получить информацию о локальных переменных с помощью отражения Java?

Ответы [ 5 ]

16 голосов
/ 25 июля 2011

Предполагая, что вы говорите о локальных переменных метода или конструктора, вы не можете узнать о них, используя отражение. Вы должны либо

  • использовать библиотеку байт-кодов, такую ​​как BCEL или ASM, или
  • используйте один из API удаленного отладчика.

Последний позволит вам получить доступ к значениям локальных переменных, но только тогда, когда JVM приостановлен агентом отладки.

Оба эти подхода основаны на том, что рассматриваемые классы компилируются с отладочной информацией. В частности, классы должны быть скомпилированы с «информацией отладки локальной переменной»; например используя javac -g .... Отладочная информация "vars" по умолчанию не включена.

9 голосов
/ 25 июля 2011

Одним словом, вы не можете. Имена локальных переменных не сохраняются компилятором.

В качестве быстрого эксперимента я скомпилировал следующий класс с использованием Java 6 и параметров компилятора по умолчанию:

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

Быстрая проверка полученного файла .class показывает, что имя локальной переменной (var) не было там.

5 голосов
/ 25 июля 2011

Нет, это невозможно с помощью Java Reflection.Такие вещи, как имена локальных переменных, обычно удаляются компилятором, чтобы обеспечить некоторую запутанность и оптимизировать пространство.Существует библиотека байт-кода ASM , которая может проверять состояние во время выполнения, что может быть полезно для вас.

2 голосов
/ 25 июля 2011

Вы можете получить доступ к локальной карте переменных, используя библиотеки обратного инжиниринга байт-кода, такие как ASM . Однако обратите внимание, что имя локальных переменных не всегда может присутствовать в байт-коде, но число и типы всегда будут там.

Нет способа получить эту информацию с помощью размышлений. Отражение работает на уровне метода, в то время как локальные переменные находятся на уровне блока кода.

2 голосов
/ 25 июля 2011

Если под моими локальными переменными вы подразумеваете переменные экземпляра и переменные класса, вот как вы бы поступили:

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

Если вы имеете в виду переменные, локальные для методов / конструкторов , вы можетене получить к ним доступ с отражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...