我想在 VisualVM (v1.4.4) 中使用 execute an OQL query 来检索对象的(非静态)字段名称。
OQL 文档描述了 heap.findClass(className)
。这将返回一个包含 fields
属性(字段名称数组)的对象。
当我执行以下 OQL 时...heap.findClass('java.io.ByteArrayInputStream').fields;
...它返回一个包含 4 个字段对象的数组( ByteArrayInputStream
has 4 fields - buf
、 count
、 mark
和 pos
- 我假设这些是返回的内容):
org.netbeans.lib.profiler.heap.HprofField@56de8c
org.netbeans.lib.profiler.heap.HprofField@56de95
org.netbeans.lib.profiler.heap.HprofField@56de9e
org.netbeans.lib.profiler.heap.HprofField@56dea7
如果我随后尝试操作此数组,例如访问每个字段的
name
和 signature
属性(如 OQL 文档中所述),则不会得到任何结果。我什至无法获得数组的长度。例如:heap.findClass('java.io.ByteArrayInputStream').fields.length;
和:
heap.findClass('java.io.ByteArrayInputStream').fields[0];
以上两个语句都返回
<no results>
。我做错了什么? 可能是一些基本的东西。就此而言,我对 JavaScript 或数据在 VisualVM 中的显示方式不太熟悉。
最佳答案
您需要使用 map() 函数。以下 OQL 检索 ByteArrayInputStream
类的字段名称:
select map(heap.findClass('java.io.ByteArrayInputStream').fields, 'it.name')
关于javascript - VisualVM v1.4.4 中的 OQL - 获取类的字段名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59582670/