Java Eclipse MAT OQL特定包中的类列表
使用EclipseMat1.9.1OQL 我想在某个包中列出堆转储中的所有类 我正在尝试以下查询:Java Eclipse MAT OQL特定包中的类列表,java,oql,eclipse-mat,Java,Oql,Eclipse Mat,使用EclipseMat1.9.1OQL 我想在某个包中列出堆转储中的所有类 我正在尝试以下查询: SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0 获取: java.lang.NullPointerException:idx位于 org.eclipse.mat.parser.internal.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位于
org.eclipse.mat.parser.internal.oql.compiler.Operation$GreaterThan.evalNull(Operation.java:232)
在
org.eclipse.mat.parser.internal.oql.compiler.Operation$RelationalOperation.compute(Operation.java:92)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1161)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.accept(OQLQueryImpl.java:1151)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.filterClasses(OQLQueryImpl.java:1133)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.doFromItem(OQLQueryImpl.java:921)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.internalExecute(OQLQueryImpl.java:690)
在
org.eclipse.mat.parser.internal.oql.OQLQueryImpl.execute(OQLQueryImpl.java:667)
在org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:52)中
org.eclipse.mat.inspections.OQLQuery.execute(OQLQuery.java:1)位于
org.eclipse.mat.query.registry.ArgumentSet.execute(ArgumentSet.java:132)
在
org.eclipse.mat.ui.snapshot.panes.OQLPane$OQLJob.doRun(OQLPane.java:468)
在
org.eclipse.mat.ui.editor.AbstractPaneJob.run(AbstractPaneJob.java:34)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:60)
请告知。该查询有几处错误<代码>idx输入
选择c.getName()作为名称,选择c.getName().indexOf(“com.mycompany”)作为java.lang.Class c中的idx,其中idx>0
是列名,因此对于WHERE
子句不可见。
OQL首先通过选择对象列表来计算FROM
子句,然后c
变量对WHERE
子句可见,在WHERE
子句中检查每个对象,以查看是否将其传递给SELECT
子句。
因此,请尝试:
但这失败的原因是:
Problem reported:
Method getName() not found in object java.lang.Class [id=0x6c027f2c8] of type org.eclipse.mat.parser.model.InstanceImpl
因为堆转储中的一些java.lang.Class对象实际上不是可能有实例的普通类,而是java.lang.Class类型的普通对象实例。这听起来很奇怪,但是这些对象是字节
,短
,int
,长
,浮
,双
,字符
,布尔
,空
。它们只是用来描述用于反射的类和方法,但这些类和方法的实例不可能存在
堆转储中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))
这仍然不起作用,因为如果类名以“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))
现在它可以工作并找到一些类
我们可以使用属性表示法稍微简化查询,其中@val是一个bean内省,与getVal()等价
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))
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))