我想在执行OQL查询 in VisualVM (v1.4.4)中检索对象的(非静态)字段名。
OQL文档描述了heap.findClass(className)。这将返回一个包含fields属性(字段名数组)的对象。
当我执行以下OQL时..。
heap.findClass('java.io.ByteArrayInputStream').fields;
..。它返回一个由4个字段对象组成的数组(ByteArrayInputStream 有4个字段 - 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中数据的显示方式。
发布于 2020-01-05 17:47:13
您需要使用地图()函数。以下OQL检索ByteArrayInputStream类的字段名:
select map(heap.findClass('java.io.ByteArrayInputStream').fields, 'it.name')发布于 2020-01-06 14:54:18
为了补充@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不完全相同。
https://stackoverflow.com/questions/59582670
复制相似问题