这是我的第一个问题。我有一个相当复杂的OQL查询,其中列出了在我们的程序包中加载的类的静态字段。我对Java 1.6.0_24的“ jhat”运行查询时遇到的一个问题是,“独特”功能无法按预期工作。我预计
select unique(['a', 'b', 'c', 'a'])
返回['a','b','c'],但返回['a'],wtf?
如果有人感兴趣,则实际的完整查询为(用您喜欢的内容替换“ com.mydomain”):
select cl.name + ' -- ' + unique(map(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain' && classof(it).name != '[Ljava.security.cert.Certificate;' && classof(it).name != 'sun.plugin2.applet.JNLP2ClassLoader'"), "classof(it).name")).join(', ')
from instanceof java.lang.Class cl
where /com.mydomain./(cl.name) && ! /com.mydomain.xs.protobuf./(cl.name)
&& length(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain'")) > 0;
最佳答案
默认情况下,unique
对对象的objectid
进行取整,这适用于实际跟踪的对象,但是对于字符串,它返回null。因此,仅保留最后一个字符串(因为所有字符串均具有非唯一的objectid
值)。
您有两种选择:
统一跟踪对象,而不是它们的名称:
map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
指定用于唯一化的“函数”,以便它适用于字符串:
unique(['a', 'b', 'c', 'a'], 'it')
这将导致字符串本身被统一。