Arthas如何获取对象的入参对象 并序列化成json?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用 Arthas 获取对象的入参并将其序列化为 JSON 时,可以结合 watch
命令和自定义脚本实现。以下是详细步骤和操作方法:
watch
命令捕获入参watch
命令是 Arthas 提供的一个强大工具,用于观测方法的入参、返回值或异常信息。要获取方法的入参对象,可以按照以下格式执行命令:
watch <类路径> <方法名> '{params}' -x <遍历深度>
<类路径>
:目标类的全限定名,例如 com.alibaba.edas.boot.DemoConsumerController
。<方法名>
:目标方法的名称,例如 redisGetAndSet
。{params}
:表示捕获方法的所有入参。-x <遍历深度>
:指定输出结果的属性遍历深度,用于处理复杂嵌套对象。假设需要捕获 com.alibaba.edas.boot.DemoConsumerController
类中 redisGetAndSet
方法的入参,并设置遍历深度为 2,命令如下:
watch com.alibaba.edas.boot.DemoConsumerController redisGetAndSet '{params}' -x 2
执行后,Arthas 会输出方法调用时的入参信息。
Arthas 的 watch
命令支持通过 Groovy 或 OGNL 表达式对捕获的数据进行进一步处理。为了将入参对象序列化为 JSON,可以结合 JSON.toJSONString
方法(来自 fastjson
库)完成。
watch com.alibaba.edas.boot.DemoConsumerController redisGetAndSet 'com.alibaba.fastjson.JSON.toJSONString(params)' -x 2
com.alibaba.fastjson.JSON.toJSONString(params)
:将捕获的入参对象序列化为 JSON 字符串。-x 2
:确保复杂嵌套对象的属性能够被正确展开。假设方法的入参是一个包含两个字段的对象,执行上述命令后可能得到如下输出:
["param1Value",{"field1":"value1","field2":"value2"}]
fastjson
库。如果未引入,可以通过其他方式(如手动编写序列化逻辑)替代。watch
命令会对方法调用进行拦截,可能对性能产生一定影响,建议仅在调试或诊断时使用。如果需要进一步验证捕获的入参是否正确,可以结合以下方法: - 查看方法源码:通过 Arthas 的 jad
命令反编译目标方法,确认入参结构。 - 调整遍历深度:根据对象的复杂程度,适当增加 -x
参数的值以展开更多层级。
通过上述步骤,您可以成功捕获方法的入参对象并将其序列化为 JSON 格式,从而便于后续分析和调试。