首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VisualVM v1.4.4中的OQL -获取A类的字段名

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

Stack Overflow用户
提问于 2020-01-03 17:15:55
回答 2查看 1.1K关注 0票数 3

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

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

当我执行以下OQL时..。

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

..。它返回一个由4个字段对象组成的数组(ByteArrayInputStream 有4个字段 - bufcountmarkpos -我假设返回的是这些对象):

代码语言:javascript
复制
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中数据的显示方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-05 17:47:13

您需要使用地图()函数。以下OQL检索ByteArrayInputStream类的字段名:

代码语言:javascript
复制
select map(heap.findClass('java.io.ByteArrayInputStream').fields, 'it.name')
票数 4
EN

Stack Overflow用户

发布于 2020-01-06 14:54:18

为了补充@Tomas给出的非常有帮助的答案,我已经接受了。

基于他的洞察力,我现在也可以在OQL中这样做--使用回调而不是表达式字符串:

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59582670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档