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

Eas*_*y K 18 java reflection

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

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

Ste*_*n C 16

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

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

后者将允许您访问局部变量的值,但仅在JVM被调试代理挂起时.

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


NPE*_*NPE 9

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

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

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

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

  • 看我的回答.简而言之,如果使用"-g"进行编译,则应该存在该信息. (4认同)

Hun*_*len 5

不行,Java反射是不可能的。诸如局部变量名称之类的东西通常会被编译器删除,以提供一些混淆并优化空间。有一个字节码库ASM ,可以在运行时检查事物的状态,这可能对您有用。