我可以使用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在代码块级别上。