【问题标题】:How can I inspect and prettyprint JDI Value objects using Jackson?如何使用 Jackson 检查和打印 JDI Value 对象?
【发布时间】:2021-10-30 18:18:32
【问题描述】:

我正在尝试以我从 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 实现的精确接口(@98​​7654324@、StringReference 等接口),然后使用相应的方法(v.getValues() 用于对象例如实现ArrayReference),并对我得到的所有值递归地执行相同的操作。

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

【问题讨论】:

    标签: java jackson jdi


    【解决方案1】:

    我最终做的方式如下:

    我创建了一个包装类 MyValue,具有一个公共属性 value 和一个 getter getValue(),我将其自定义为返回:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2011-05-09
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多