【问题标题】:OQL in VisualVM v1.4.4 - Get A Class's Field NamesVisualVM v1.4.4 中的 OQL - 获取类的字段名称
【发布时间】:2020-01-03 17:15:55
【问题描述】:

我想在 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 - 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 中的显示方式不是很熟悉。

【问题讨论】:

  • 嗨!我也是 OQL 的新手,您是否尝试使用前缀 select 进行查询说 select heap.findClass('java.io.ByteArrayInputStream').fields;
  • 不 - 我没有使用 select 语法。只是原生 JavaScript,如上所示。 (顺便说一句,如果我使用select 语法,我会得到相同的结果 - 我刚刚尝试过)。

标签: javascript jvm visualvm oql


【解决方案1】:

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

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 不完全相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多