Java JDB如何使用eval执行多行代码?动态代码评估方案咨询
问题说明
JDK自带的jdb调试工具的eval命令本身存在明确的语法支持边界:
- 仅支持单行符合JDI规范的表达式求值,不支持
for/while这类多行流程控制结构 - 不支持
import关键字,所有类必须写全限定类名 - 表达式解析器存在缺陷,无法正确识别lambda的参数定义,直接写lambda块会抛出参数未知的解析错误
你碰到的两类报错都是工具本身的限制导致的,不是代码写法问题。
可行解决方案
1. 临时方法封装多行逻辑
不需要强行在eval命令里写多行结构,在当前调试的类中提前写好临时的工具方法,把需要执行的循环、lambda逻辑封装在方法内部,调试时直接调用该方法即可。
比如要实现循环打印数字的逻辑,先在类中加临时方法:
// 临时调试用方法,调试完成删掉即可 public static void printIntRange(int start, int end) { for (int i = start; i < end; i++) { System.out.println(i); } }
在jdb中直接执行eval 你当前调试的类全限定名.printIntRange(0,3)就能得到预期输出,不需要在交互命令里写多行for循环。
针对import的限制,所有调用的类直接写全限定名即可,和你之前反射调用java.lang.Class.forName的写法一致。
2. 换用支持复杂代码片段求值的调试器
如果不想在业务代码里加临时调试方法,直接换用成熟Java IDE自带的调试功能即可:IDEA、Eclipse的调试器都内置了代码片段求值功能,原生支持多行代码块、lambda语法、自动导包、各类流程控制语句,不会出现jdb里的解析错误。
内容的提问来源于stack exchange,提问作者CS QGB
相关产品推荐
相关产品推荐

