1

これは私の最初の投稿された質問です。パッケージにロードされたクラスの静的フィールドを一覧表示する、かなり複雑なOQLクエリがあります。Java 1.6.0_24の「jhat」に対してクエリを実行する際に見られる問題の1つは、「unique」関数が期待どおりに機能しないことです。私が期待する

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;
4

1 に答える 1

1

デフォルトでuniqueは、オブジェクトの で一意化されますobjectid。これは、実際にトレースされるオブジェクトに適していますが、文字列の場合は null を返します。したがって、最後の文字列のみが保持されます (すべての文字列が一意でないobjectid値を持っているため)。

次の 2 つのオプションがあります。

  1. 名前ではなく、トレースされたオブジェクトを一意化します。

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. 文字列に対して機能するように、一意化する「関数」を指定します。

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

    これにより、文字列自体が一意になります。

于 2011-05-16T20:25:06.167 に答える