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

3
我想在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];

以上两个语句均返回 <无结果>

我做错了什么? 可能是一些基础问题。我对JavaScript不是很熟悉 - 或者说我对VisualVM中的数据显示也不是很熟悉。


你好!我也是OQL的新手,你是否尝试使用前缀_select_来查询,例如_select heap.findClass('java.io.ByteArrayInputStream').fields;_? - BHAWANI SINGH
不,我没有使用“select”语法。就像上面展示的那样,我只是使用了本地JavaScript。顺便说一下,如果我使用“select”语法,我也会得到相同的结果-我刚刚尝试过了。 - andrewJames
2个回答

4
您需要使用map()函数。以下是用于检索ByteArrayInputStream类字段名称的OQL代码:
select map(heap.findClass('java.io.ByteArrayInputStream').fields, 'it.name')

2

补充一下@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相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接