使用Java反射,可以获得局部变量的名称吗?例如,如果我有这个:
Foo b = new Foo();
Foo a = new Foo();
Foo r = new Foo();
是否可以实现一个方法来查找这些变量的名称,如下所示:
public void baz(Foo... foos)
{
for (Foo foo: foos) {
// Print the name of each foo - b, a, and r
System.out.println(***);
}
}
编辑:这个问题与的不同之处在于,它更纯粹地询问是否可以使用反射来确定局部变量的名称,而另一个问题(包括接受的答案)更专注于测试变量的值。
发布于 2009-04-13 15:55:55
从Java 8开始,一些局部变量名信息可以通过反射获得。请参阅下面的“更新”部分。
完整的信息通常存储在类文件中。一种编译时优化是删除它,从而节省空间(并提供一些模糊处理)。但是,当它存在时,每个方法都有一个局部变量表属性,该属性列出了局部变量的类型和名称,以及它们在作用域中的指令范围。
也许像ASM这样的字节码工程库可以让您在运行时检查这些信息。我能想到的唯一合理的需要这些信息的地方是在开发工具中,因此字节码工程也可能用于其他目的。
更新:对was added to Java 8.参数(一种特殊的局部变量)名称的有限支持现在可以通过反射获得。在其他用途中,这可以帮助替换依赖注入容器使用的@ParameterName
注释。
发布于 2010-12-30 19:03:36
import java.lang.reflect.Field;
public class test {
public int i = 5;
public Integer test = 5;
public String omghi = "der";
public static String testStatic = "THIS IS STATIC";
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
test t = new test();
for(Field f : t.getClass().getFields()) {
System.out.println(f.getGenericType() +" "+f.getName() + " = " + f.get(t));
}
}
}
发布于 2012-12-11 15:08:23
你可以这样做:
Field[] fields = YourClass.class.getDeclaredFields();
//gives no of fields
System.out.println(fields.length);
for (Field field : fields) {
//gives the names of the fields
System.out.println(field.getName());
}
https://stackoverflow.com/questions/744226
复制相似问题