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

EDIT: This question is different from 100 in that it more purely asks the question about whether one can use reflection to determine the name of a local variable, whereas the other question (including the accepted answer) is more focused on testing values of variables.

推荐答案

从Java8开始,一些局部变量名信息可以通过反射获得.请参阅下面的"Update"部分.

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

也许像ASM这样的字节码工程库可以让您在运行时判断这些信息.我认为需要这些信息的唯一合理的地方是在开发工具中,因此字节码工程可能也有其他用途.


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

Java相关问答推荐

卡夫卡流列表Serdes:总是空的

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

我可以从Java模块中排除maven资源文件夹吗?

SQlite for Android无法使用json_group_array/json_object

如何在Java中声明未使用的变量?

Java中后期绑定的替代概念

弹簧靴和龙目岛

为什么我的ArrayList索引的索引总是返回-1?

';com.itextpdf.ext.html.WebColors已弃用

对某一Hyroby控制器禁用@cacheable

Jakarta CDI强制bean构造/注册遗留事件侦听器

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

Jolt变换JSON数组问题

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

buildDir:File!&#的getter解决方案是什么?39.被抛弃

如何在JUNIT测试中覆盖ExecutorService?

如何以编程方式保存workBench.xmi?

为了安全起见,有必要复制一份 list 吗?

读取ConcurrentHashMap中的可变对象