首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java反射:如何获取变量的名称?

Java反射:如何获取变量的名称?
EN

Stack Overflow用户
提问于 2009-04-13 15:17:48
回答 5查看 287.7K关注 0票数 153

使用Java反射,可以获得局部变量的名称吗?例如,如果我有这个:

代码语言:javascript
复制
Foo b = new Foo();
Foo a = new Foo();
Foo r = new Foo();

是否可以实现一个方法来查找这些变量的名称,如下所示:

代码语言:javascript
复制
public void baz(Foo... foos)
{
    for (Foo foo: foos) {
        // Print the name of each foo - b, a, and r
        System.out.println(***); 
    }
}

编辑:这个问题与的不同之处在于,它更纯粹地询问是否可以使用反射来确定局部变量的名称,而另一个问题(包括接受的答案)更专注于测试变量的值。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-13 15:55:55

从Java 8开始,一些局部变量名信息可以通过反射获得。请参阅下面的“更新”部分。

完整的信息通常存储在类文件中。一种编译时优化是删除它,从而节省空间(并提供一些模糊处理)。但是,当它存在时,每个方法都有一个局部变量表属性,该属性列出了局部变量的类型和名称,以及它们在作用域中的指令范围。

也许像ASM这样的字节码工程库可以让您在运行时检查这些信息。我能想到的唯一合理的需要这些信息的地方是在开发工具中,因此字节码工程也可能用于其他目的。

更新:对was added to Java 8.参数(一种特殊的局部变量)名称的有限支持现在可以通过反射获得。在其他用途中,这可以帮助替换依赖注入容器使用的@ParameterName注释。

票数 68
EN

Stack Overflow用户

发布于 2010-12-30 19:03:36

代码语言:javascript
复制
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));
  }
 }

}
票数 15
EN

Stack Overflow用户

发布于 2012-12-11 15:08:23

你可以这样做:

代码语言:javascript
复制
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());   
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/744226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档