VisualVM v1.4.4 中的 OQL - 获取 Class 的字段名称
OQL in VisualVM v1.4.4 - Get A Class's Field Names
我想 execute an OQL query 在 VisualVM (v1.4.4) 中检索对象的(非静态)字段名称。
OQL 文档描述了 heap.findClass(className)
。 return 是一个包含 fields
属性(字段名称数组)的对象。
当我执行以下 OQL 时...
heap.findClass('java.io.ByteArrayInputStream').fields;
... 它 return 是一个包含 4 个字段对象的数组 (ByteArrayInputStream
has 4 fields - buf
, count
, mark
, 和 pos
- 我假设这些是 returned):
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];
以上两种说法return <no results>
.
我做错了什么? 可能是一些基本问题。我不太熟悉 JavaScript - 或者数据在 VisualVM 中的显示方式,就此而言。
您需要使用map()功能。以下 OQL 检索 ByteArrayInputStream
class 的字段名称:
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不完全一样。
我想 execute an OQL query 在 VisualVM (v1.4.4) 中检索对象的(非静态)字段名称。
OQL 文档描述了 heap.findClass(className)
。 return 是一个包含 fields
属性(字段名称数组)的对象。
当我执行以下 OQL 时...
heap.findClass('java.io.ByteArrayInputStream').fields;
... 它 return 是一个包含 4 个字段对象的数组 (ByteArrayInputStream
has 4 fields - buf
, count
, mark
, 和 pos
- 我假设这些是 returned):
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];
以上两种说法return <no results>
.
我做错了什么? 可能是一些基本问题。我不太熟悉 JavaScript - 或者数据在 VisualVM 中的显示方式,就此而言。
您需要使用map()功能。以下 OQL 检索 ByteArrayInputStream
class 的字段名称:
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不完全一样。