Проблема с "уникальной" функцией "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 ценности).

У вас есть два варианта:

  1. Uniquify по отслеживаемым объектам, а не по их именам:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. Укажите "функцию" для унификации, чтобы она работала со строками:

    unique(['a', 'b', 'c', 'a'], 'it')
    

    Это приведет к тому, что сами струны будут унифицированы.

Другие вопросы по тегам