我可以使用Javareflection获取有关本地variables的信息吗?

我需要知道局部variables的types。 我正在使用Javareflection,使用我无法得到它。 你可以让我知道如何知道本地variables的types/名称。

我可以使用Javareflection获取有关本地variables的信息吗?

假设你正在谈论一个方法或构造函数的局部variables,你不能使用reflection来找出它们。 你必须要么

  • 使用字节码库,如BCEL或ASM,或者
  • 使用远程debugging器API之一。

后者将允许您访问本地variables的值,但仅当debugging代理程序挂起JVM时。

这两种方法都依赖于使用debugging信息编译的类。 具体来说,这些类需要编译“本地variablesdebugging信息”。 例如使用javac -g ... “vars”debugging信息默认不包含在内。

总之,你不能。 编译器不保存局部variables的名称。

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

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

快速检查生成的.class文件显示,局部variables( var )的名称没有使其成为可能。

不,Java Reflection是不可能的。 像局部variables名称之类的东西通常被编译器删除,以提供一些混淆和优化空间。 有一个字节代码库ASM可以在运行时检查事物的状态,这可能对你有用。

如果我的本地variables是指实例variables和类variables,那么你将如何去做:

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

如果你的意思是方法/构造函数的局部variables ,你不能用reflection来访问它们。

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

没有办法通过反思来获得这些信息。 reflection在方法级别上工作,而局部variables在代码块级别上。