某包类的Eclipse MAT OQL列表
Eclipse MAT OQL list of classes in a certain package
使用 Eclipse MAT 1.9.1 OQL
我想列出某个包中堆转储中的所有类。
我正在尝试查询:
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0
得到:
java.lang.NullPointerException: idx at
org.eclipse.mat.parser.internal.oql.compiler.Operation$GreaterThan.evalNull(Operation.java:232)
at
org.eclipse.mat.parser.internal.oql.compiler.Operation$RelationalOperation.compute(Operation.java:92)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1161)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1151)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.filterClasses(OQLQueryImpl.java:1133)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.doFromItem(OQLQueryImpl.java:921)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.internalExecute(OQLQueryImpl.java:690)
at
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.execute(OQLQueryImpl.java:667)
at org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:52) at
org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:1) at
org.eclipse.mat.query.registry.ArgumentSet.execute(ArgumentSet.java:132)
at
org.eclipse.mat.ui.snapshot.panes.OQLPane$OQLJob.doRun(OQLPane.java:468)
at
org.eclipse.mat.ui.editor.AbstractPaneJob.run(AbstractPaneJob.java:34)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:60)
请指教
该查询有几处错误。 idx
在
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0
是列名,因此对 WHERE
子句不可见。
OQL 评估 FROM
子句首先选择对象列表,然后 c
变量对 WHERE
子句可见SELECT
个子句。
所以尝试:
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE c.getName().indexOf("com.mycompany") > 0
但失败的原因是:
Problem reported:
Method getName() not found in object java.lang.Class [id=0x6c027f2c8] of type org.eclipse.mat.parser.model.InstanceImpl
因为堆转储中的某些 java.lang.Class 对象实际上不是可以具有实例的普通 classes,而是 java.lang.Class 类型的普通对象实例。这听起来很奇怪,但这些对象是 byte
、short
、int
、long
、float
、double
、char
boolean
,void
。它们仅用于描述反射的 classes 和方法 - 但这些实例不存在。
堆转储中的 MAT 对象内部表示为
org.eclipse.mat.snapshot.model.IObject
和一些也是亚型 org.eclipse.mat.snapshot.model.IClass
。我们需要排除上面的那 9 个特殊对象。我已将您的查询更改为查找 com.sun,因为我的转储没有 com.mycompany 个对象。
SELECT c.getName() AS name, c.getName().indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") > 0))
这仍然不起作用,因为如果 class 名称以 'com.sun' 开头,则索引将为 0 并且无法通过测试。更改测试运算符:
SELECT c.getName() AS name, c.getName().indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") >= 0))
这现在有效并找到了一些 classes。
我们可以通过使用属性表示法稍微简化查询,其中@val 是一个 bean 自省,相当于 getVal()。
SELECT c.@name AS name, c.@name.indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") >= 0))
使用 Eclipse MAT 1.9.1 OQL
我想列出某个包中堆转储中的所有类。
我正在尝试查询:
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0
得到:
java.lang.NullPointerException: idx at org.eclipse.mat.parser.internal.oql.compiler.Operation$GreaterThan.evalNull(Operation.java:232) at org.eclipse.mat.parser.internal.oql.compiler.Operation$RelationalOperation.compute(Operation.java:92) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1161) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1151) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.filterClasses(OQLQueryImpl.java:1133) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.doFromItem(OQLQueryImpl.java:921) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.internalExecute(OQLQueryImpl.java:690) at org.eclipse.mat.parser.internal.oql.OQLQueryImpl.execute(OQLQueryImpl.java:667) at org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:52) at org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:1) at org.eclipse.mat.query.registry.ArgumentSet.execute(ArgumentSet.java:132) at org.eclipse.mat.ui.snapshot.panes.OQLPane$OQLJob.doRun(OQLPane.java:468) at org.eclipse.mat.ui.editor.AbstractPaneJob.run(AbstractPaneJob.java:34) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:60)
请指教
该查询有几处错误。 idx
在
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0
是列名,因此对 WHERE
子句不可见。
OQL 评估 FROM
子句首先选择对象列表,然后 c
变量对 WHERE
子句可见SELECT
个子句。
所以尝试:
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE c.getName().indexOf("com.mycompany") > 0
但失败的原因是:
Problem reported:
Method getName() not found in object java.lang.Class [id=0x6c027f2c8] of type org.eclipse.mat.parser.model.InstanceImpl
因为堆转储中的某些 java.lang.Class 对象实际上不是可以具有实例的普通 classes,而是 java.lang.Class 类型的普通对象实例。这听起来很奇怪,但这些对象是 byte
、short
、int
、long
、float
、double
、char
boolean
,void
。它们仅用于描述反射的 classes 和方法 - 但这些实例不存在。
堆转储中的 MAT 对象内部表示为
org.eclipse.mat.snapshot.model.IObject
和一些也是亚型 org.eclipse.mat.snapshot.model.IClass
。我们需要排除上面的那 9 个特殊对象。我已将您的查询更改为查找 com.sun,因为我的转储没有 com.mycompany 个对象。
SELECT c.getName() AS name, c.getName().indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") > 0))
这仍然不起作用,因为如果 class 名称以 'com.sun' 开头,则索引将为 0 并且无法通过测试。更改测试运算符:
SELECT c.getName() AS name, c.getName().indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") >= 0))
这现在有效并找到了一些 classes。
我们可以通过使用属性表示法稍微简化查询,其中@val 是一个 bean 自省,相当于 getVal()。
SELECT c.@name AS name, c.@name.indexOf("com.sun") AS idx
FROM java.lang.Class c
WHERE ((c implements org.eclipse.mat.snapshot.model.IClass) and (c.getName().indexOf("com.sun") >= 0))