首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipse MAT OQL在特定包中的类列表

Eclipse MAT OQL在特定包中的类列表
EN

Stack Overflow用户
提问于 2020-07-28 19:28:59
回答 1查看 627关注 0票数 0

使用Eclipse 1.9.1 OQL

我想在某个包中列出堆转储中的所有类。

我正在尝试查询:

代码语言:javascript
复制
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE idx > 0 

得到:

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) 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)在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)

请给我建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-02 15:12:21

这个查询有几处问题。idxSELECT 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子句。所以试着:

代码语言:javascript
复制
SELECT c.getName() as name, c.getName().indexOf("com.mycompany") as idx FROM java.lang.Class c WHERE c.getName().indexOf("com.mycompany") > 0

但失败的原因是:

代码语言:javascript
复制
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类型的普通对象实例。这听起来很奇怪,但这些对象是byteshortintlongfloatdoublecharbooleanvoid。它们只是用来描述用于反射的类和方法,但是这些实例不可能存在。

堆转储中的MAT对象内部表示为org.eclipse.mat.snapshot.model.IObject,有些对象还具有子类型org.eclipse.mat.snapshot.model.IClass。我们需要排除上述9种特殊物体。我已经更改了您的查询,以查找com.sun,因为我的转储不会有com.mycompany对象。

代码语言:javascript
复制
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,并将失败测试。更改测试操作符:

代码语言:javascript
复制
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()。

代码语言:javascript
复制
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)) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63141472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档