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

我可以使用Java反射获取有关局部变量的信息吗?,java,reflection,Java,Reflection,我需要知道局部变量的类型。我正在使用Java反射,使用它我无法获得它。你能告诉我如何知道局部变量的类型/名称吗 我可以使用Java反射获取有关局部变量的信息吗?如果我的局部变量指的是实例变量和类变量,那么您可以这样做: String s = new String("This is a sample"); Class<String> type = s.getClass(); for ( Field f : type.getFields() ) { System.out.prin

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


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

如果我的局部变量指的是实例变量和类变量,那么您可以这样做:

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());
}
String s=新字符串(“这是一个示例”);
类类型=s.getClass();
对于(字段f:type.getFields()){
System.out.printf(“字段%s的类型为%s%n”,f.getName(),f.getType().getName());
}

如果您的意思是方法/构造函数的局部变量,则不能通过反射来访问它们。

总之,您不能。编译器不保留局部变量的名称

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

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

快速检查生成的
.class
文件发现局部变量(
var
)的名称不在其中。

您可以使用字节码反向工程库访问局部变量映射,如。然而,请注意,局部变量的名称可能并不总是出现在字节码中,但其数量和类型将始终存在


无法通过反射获得此信息。反射在方法级工作,而局部变量在代码块级工作。

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

假设您谈论的是一个方法或构造函数的局部变量,您无法使用反射来了解它们。你要么

  • 使用字节码库,如BCEL或ASM,或
  • 使用一个远程调试器API
后者将允许您访问本地变量的值,但只能在调试代理挂起JVM时访问


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

请参阅我的答案。简单地说,如果您使用“-g”编译,则信息应该是存在的。密切相关,但要列出所有局部变量,请改为:1表示“局部变量在代码块级别”