【发布时间】:2009-10-14 19:45:26
【问题描述】:
有没有办法以编程方式访问方法中定义的变量(任何方法,无论是否静态)?调试代码时 IDE 是如何显示它们的?
【问题讨论】:
有没有办法以编程方式访问方法中定义的变量(任何方法,无论是否静态)?调试代码时 IDE 是如何显示它们的?
【问题讨论】:
您可能想阅读this,它很好地解释了这一点。您正在寻找的位是 RemoteStackFrame,这就是事物如何获取当前范围内的事物的方式
这是一个复杂的主题,但我希望这会有所帮助。
【讨论】:
我不知道其他 IDE,但 Eclipse 使用 The Abstract Syntax Tree (AST)
【讨论】:
如果您使用 Eclipse,您可以使用 Eclipse 提供的 JDT API。如果您将创建插件项目,这些将可用。
【讨论】:
IDE 通常使用调试 api 的组合,例如 [Java Platform Debugger Architecture][1] 提供的那个,它了解正在调试的代码的结构。
读取局部变量的值(即使在调试时),需要使用调试信息编译类文件。在 Java 中(与许多其他语言一样),必须显式生成调试信息才能在运行时对其进行访问。特别是局部变量和从字节码到源代码行号的映射。
[JDI][2] api 很容易用于实现简单的调试器。但是,如果您正在寻找的是对局部变量的某种反映,那么您就不走运了。
对于最后一种情况,我唯一能想到的是使用某种字节码操作库,例如 [BCEL][3] 或 [ASM][4],并在加载字节码之前修改它以允许您访问运行时的变量值。
这肯定会减慢代码速度并且难以实现。最后,如果您退后一步考虑一下,可能会更容易完全避免这个问题。
(抱歉链接损坏,但 StackOverflow 限制了链接数量)
[1]:http://java.sun.com/javase/technologies/core/toolsapis/jpda/ [2]:http://java.sun.com/javase/6/docs/jdk/api/jpda/jdi/index.html [3]:http://jakarta.apache.org/bcel/ [4]:http://asm.ow2.org/
【讨论】: