如果您使用以下的调试信息进行编译:javac -g),局部变量的名称保存在.class文件中。例如,以这个简单的类为例:class TestLocalVarNames {

public String aMethod(int arg) {

String local1 = "a string";

StringBuilder local2 = new StringBuilder();

return local2.append(local1).append(arg).toString();

}}

编译后javac -g:vars TestLocalVarNames.java,局部变量的名称现在.class文件中。javap氏-l标志(“打印行号和局部变量表”)可以显示它们。

javap -l -c TestLocalVarNames显示:class TestLocalVarNames extends java.lang.Object{TestLocalVarNames();

Code:

0:   aload_0   1:   invokespecial   #1; //Method java/lang/Object."":()V

4:   return

LocalVariableTable:

Start  Length  Slot  Name   Signature

0      5      0    this       LTestLocalVarNames;public java.lang.String aMethod(int);

Code:

0:   ldc     #2; //String a string

2:   astore_2   3:   new     #3; //class java/lang/StringBuilder

6:   dup   7:   invokespecial   #4; //Method java/lang/StringBuilder."":()V

10:  astore_3   11:  aload_3   12:  aload_2   13:  invokevirtual   #5;

//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

16:  iload_1   17:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

20:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

23:  areturn  LocalVariableTable:

Start  Length  Slot  Name   Signature

0      24      0    this       LTestLocalVarNames;

0      24      1    arg       I   3      21      2    local1       Ljava/lang/String;

11      13      3    local2       Ljava/lang/StringBuilder;}

这个VM规范解释了我们在这里看到的:这个LocalVariableTable属性的可选变量长度属性。Code(第4.7.3节)属性。调试器可用于在方法执行期间确定给定局部变量的值。

这个LocalVariableTable在每个插槽中存储变量的名称和类型,因此可以将它们与字节码匹配。调试器可以这样做“计算表达式”。

然而,正如Erickson所说,没有办法通过正常反射访问这个表。如果你还决定这么做,我相信Java平台调试器体系结构(JPDA)会有帮助的(但我自己从来没用过)。

java反射 获取变量值_Java反射:如何获取变量的名称?相关推荐

  1. 通过反射将变量值转为变量名本身

    通过反射将变量值转为变量名本身 这是.NET反射的一个有趣小例子:  通过反射将变量值转为变量名本身. 当然要先添加命名空间:using System.Reflection; 示例代码如下: clas ...

  2. java反射设置属性值_Java反射如何有效的修改final属性值详解

    前言 以前写过一篇 Java 反射修改 final 属性值,本文将在这里重新温习一下Java反射如何有效的修改final属性值,下面话不多说了,来一起看看详细的介绍: 假设有个类 class Pers ...

  3. java 反射机制详解_java反射机制原理详解

    反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...

  4. java反射更改方法内容_Java反射

    类的加载 java运行的都是类 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化. 加载 加载,是指Java虚拟机查找字节流(查找.class ...

  5. java反射机制详解_Java反射机制详解

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  6. java反射的编译过程_Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  7. java反射有什么用_java反射的作用知识点总结

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助. 什么是Java的反射? 反射是Java的特征之一,是一种间接操作 ...

  8. java 反射 接口工具类_Java 反射工具类 ReflectionUtils

    import lombok.extern.slf4j.Slf4j; import java.lang.reflect.*; /** * 反射的 Utils 函数集合 * 提供访问私有变量, 获取泛型类 ...

  9. java反射为什么消耗资源_Java反射笔记

    第一:先认识Class类 类也是一种实例,类的实例创建有三种方式. 类的实例对象创建的方式有两种.以下的代码详细的介绍: packagecom.company;import java.util.*;p ...

最新文章

  1. 牛津-阿斯利康疫苗与出血性疾病风险轻微升高有关 |《自然-医学》论文
  2. 我一不小心把ubuntu里的ps这样的命令删掉了,应该怎么重装呢
  3. selenium教程
  4. Python函数式编程指南
  5. [2017.11.11特辑]以一个光棍节表白案例浅谈ECMAScript6模块化的使用方法
  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写...
  7. 近 10 年新秀编程语言大 PK,Pick 它!
  8. 防抖与节流方案_关于图片懒加载的几种方案
  9. 如何让 Mac 朗读提醒信息中的文本?
  10. HDU 1465 不容易系列之一 (错排)
  11. Firefox for iOS 终于登陆中国
  12. 华北科技计算机组成原理,华北科技学院—《计算机组成原理》设计性实验报告.doc...
  13. mysql 统计七日留存率_1.七日留存率-SQL实现
  14. 使用DataGrip连接神通数据库
  15. okv5 API常见问题
  16. 程序员薪水最高的25家公司
  17. Java IO流(下)
  18. 高并发编程(四)高并发解决方案从前端到数据库
  19. 精简指令集结构(Reduced Instruction Set Computer,RISC)
  20. 抖音落地页跳转添加微信好友的方法

热门文章

  1. [java8]时间差
  2. Java入门系列-20-异常
  3. JavaScript 基础(十三):Window对象
  4. Using Oracle Data Integrator Open Tools
  5. JSON和JSONP的差别,以及用法
  6. 【学习笔记】HTML基础:使用html制作网页
  7. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南19:对细粒度的安全定义自定义安全权限...
  8. 分布式文件系统FastDFS设计原理
  9. DDMS连接bluestacks找不到设备
  10. java printwriter 没有关闭_Java PrintWriter close()方法