VisualVM v1.4.4 中的 OQL - 获取类的字段名称



我想在 VisualVM (v1.4.4( 中执行 OQL 查询以检索对象的(非静态(字段名称。

OQL 文档介绍了heap.findClass(className).这将返回一个包含fields属性(字段名称数组(的对象。

当我执行以下 OQL 时...

heap.findClass('java.io.ByteArrayInputStream').fields;

。它返回一个包含 4 个字段对象的数组(ByteArrayInputStream有 4 个字段 -bufcountmarkpos- 我假设这些是返回的内容(:

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

如果我随后尝试操作此数组,例如访问每个字段的namesignature属性(如 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')

只是为了补充@Tomas非常有用的答案 - 我已经接受了。

根据他的见解,我现在也可以在 OQL 中做这样的事情 - 使用回调而不是表达式字符串:

map(heap.findClass('java.io.ByteArrayInputStream').fields, function (it) { 
var res = ''; 
res += toHtml(it.name) + " : " + toHtml(it.signature); 
return res + "<br>"; 
});

上面的例子是微不足道的,但它开辟了更多的可能性。

他的回答也让我意识到我哪里出错了:OQL使用JavaScript表达式语言- 与JavaScript不完全相同。

相关内容

  • 没有找到相关文章

最新更新