Question

Ceci est ma première question publiée. J'ai une requête OQL assez compliquée qui répertorie les champs de classes statiques chargés dans nos packages. Un problème que je vois en exécutant la requête contre «Jhat» de Java 1.6.0_24 est que la fonction «unique» ne fonctionne pas comme prévu. Je m'attends à

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

Pour retourner ['A', 'B', 'C'] mais à la place, il renvoie ['A'], WTF?

Si quelqu'un est intéressé, la requête complète réelle est (remplacer «com.mydomain» par ce que vous aimez):

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;
Était-ce utile?

La solution

Par défaut, unique unifie sur l'objet objectid, qui convient aux objets tracés réels, mais pour les chaînes, il renvoie nul. Ainsi, seule la dernière corde est conservée (car toutes les cordes ont non à uniques objectid valeurs).

Vous avez deux options:

  1. Uniques sur les objets tracés, plutôt que leurs noms:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. Spécifiez la "fonction" avec qui s'unifie, afin qu'elle fonctionne pour les chaînes:

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

    Cela fera que les cordes elles-mêmes soient unifiées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top