我可以使用Java反射获取有关局部变量的信息吗?

时间:2011-07-25 13:36:31

标签: java reflection

我需要知道局部变量的类型。我正在使用Java反射,使用它我无法得到它。能告诉我如何知道局部变量的类型/名称吗?

我可以使用Java反射获取有关局部变量的信息吗?

5 个答案:

答案 0 :(得分:16)

假设您正在讨论方法或构造函数的局部变量,您无法使用反射找到它们。你必须

  • 使用字节码库,例如BCEL或ASM,或
  • 使用其中一个远程调试器API。

后者将允许您访问局部变量的值,但仅在调试代理暂停JVM时。

这两种方法都依赖于使用调试信息编译的有问题的类。具体来说,需要使用“局部变量调试信息”编译类;例如使用javac -g ...。默认情况下不包括“vars”调试信息。

答案 1 :(得分:9)

总之,你做不到。编译器不保留局部变量的名称。

作为一个快速实验,我使用Java 6和默认编译器选项编译了以下类:

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

快速检查生成的.class文件会发现局部变量(var)的名称没有出现在那里。

答案 2 :(得分:5)

不能用Java Reflection实现。编译器通常会删除局部变量名称之类的内容,以提供一些模糊处理并优化空间。有一个字节码库ASM 它可以在运行时检查事物的状态,这可能对你有用。

答案 3 :(得分:2)

如果我的局部变量是指实例变量和类变量,那么您将如何:

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());
}

如果您的意思是方法/构造函数本地的变量,则无法使用反射访问它们。

答案 4 :(得分:2)

您可以使用字节码逆向工程库(如ASM)访问本地变量映射。但请注意,字节码中可能并不总是存在局部变量的名称,但数字和类型将始终存在。

无法通过反射获取此信息。反射适用于方法级别,而局部变量位于代码块级别。