Java 1.6.0_24에서 'JHAT'의 OQL '고유 한 기능'
문제
이것은 첫 번째 게시 된 질문입니다.우리 패키지에로드 된 클래스의 정적 필드를 나열하는 상당히 복잡한 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
에서 비 띄지 않습니다.따라서 마지막 문자열 만 유지됩니다 (모든 문자열은 고유 한 objectid
값이 있으므로).
두 가지 옵션이 있습니다.
-
추적 된 물체에서 이름이 아니라,
map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
-
uncilify를 사용하여 "기능"을 지정하여 문자열에 대해 작동합니다.
.unique(['a', 'b', 'c', 'a'], 'it')
문자열 자체가 불일치하게 될 것입니다.
제휴하지 않습니다 StackOverflow