首页 > 解决方案 > 如何使用 Jackson 检查和打印 JDI Value 对象?

问题描述

我正在尝试以我从 Java 调试接口检索到的 JSON 格式的对象进行漂亮打印。这些对象是我的断点命中的方法的参数。

我在 BreakpointEvent 处理程序中的代码如下:

// event is the current BreakpointEvent
StackFrame sf = event.thread().frame(0);
for (Value v : sf.getArgumentValues()) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(v));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
        

但是,我得到的唯一输出是一堆{"collected":false},这根本没有帮助......

我可以手动进行检查,首先检查每个实现的精确接口(接口v,如ArrayReferenceStringReference... .v.getValues()ArrayReference

但是人工检查更容易出错,而且在代码和维护方面也更加繁重。我相信杰克逊可以在这里做到这一点,但我没有让它发挥作用......

标签: javajacksonjdi

解决方案


我最终做的方式如下:

我创建了一个包装类 MyValue,它有一个 public attributevalue和一个 getter getValue(),我自定义它以返回:

  • 如果可能,使用 java 基类型;
  • MyValue 对象的 ArrayList 或 HashMap,用于 ArrayReference 和 ObjectReference Value 对象。

我还必须处理无限引用(循环图,例如对象 A 具有对象 B 的引用,对象 B 具有对象 A 的引用),因此 MyValue 类还包含一个祖先列表,以避免循环。希望这对将来的某人有所帮助。


推荐阅读