Java Eclipse MAT OQL特定包中的类列表

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

使用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.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))