Проблема с "уникальной" функцией "jhat" в Java 1.6.0_24
Это мой первый опубликованный вопрос. У меня довольно сложный OQL-запрос, в котором перечислены статические поля классов, загруженных в наши пакеты. Одна из проблем, с которыми я сталкиваюсь при выполнении запроса к jhat из Java 1.6.0_24, заключается в том, что "уникальная" функция работает не так, как ожидалось. Я жду
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;
1 ответ
По умолчанию, unique
Уникальность на объекте objectid
, который подходит для реальных отслеживаемых объектов, но для строк возвращает нуль. Таким образом, сохраняется только последняя строка (поскольку все строки имеют неуникальные objectid
ценности).
У вас есть два варианта:
Uniquify по отслеживаемым объектам, а не по их именам:
map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
Укажите "функцию" для унификации, чтобы она работала со строками:
unique(['a', 'b', 'c', 'a'], 'it')
Это приведет к тому, что сами струны будут унифицированы.