问题陈述:
Java Reflection可用于检索变量名称本地声明的变量?给出如下代码片段:
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(***); // Placeholder for variable name access } }
解决方案:
直到 Java 8,通过反射检索局部变量名称是不可能的。但是,该版本中引入了部分支持。参数名称是一种特殊类型的局部变量,可以通过反射来访问。事实证明,这对于替换依赖注入框架常用的 @ParameterName 等注释很有用。
为了获得更全面的局部变量名称信息,检查类文件可能会提供一些见解。在编译过程中,优化技术有时会消除这些数据以节省空间。但是,如果存在,方法的局部变量表属性会列出其各自指令范围内的变量类型和名称。
字节码工程工具(例如 ASM)可以潜在地提供在运行时检查此信息的机制。鉴于此功能主要在开发环境中的利基应用,此类库提供的补充功能不仅仅是提取变量名称。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3