D.2 FROM子句
1.FROM子句指定需要查询的类
OQL查询需要在FROM子句定义的查询范围上进行操作。FROM子句可以接受的查询范围描述包括下列几种方式:
1)通过类名进行查询,如:
SELECT * FROM java.lang.String
2)通过正则表达式匹配一组类名进行查询,如:
SELECT FROM"java.lang.."
3)通过类对象在堆转储快照中的地址进行查询,如:
SELECT * FROM 0xe14a100
4)通过对象在堆转储快照中的ID进行查询,如:
SELECT * FROM 3022
5)在子查询中的结果集中进行查询,如:
SELECT FROM(SELECT FROM java.lang.Class c WHERE c implements org.eclipse.mat.snapshot.model.IClass)
上面的查询返回堆转储快照中所有实现了“org.eclipse.mat.snapshot.model.IClass”接口的类。下面的这句查询使用属性访问器达到了同样的效果,它直接调用了ISnapshot对象的方法:
SELECT * FROM $snapshot.getClasses()
2.包含子类
使用“INSTANCEOF”关键字把指定类的子类列入查询结果集之中,如:
SELECT * FROM INSTANCEOF java.lang.ref.Reference
这个查询的结果集中将会包含WeakReference、SoftReference和PhantomReference类型的对象,因为它们都继承自java.lang.ref.Reference。下面这句查询也有相同的结果:
SELECT * FROM $snapshot.getClassesByName("java.lang.ref.Reference",true)
3.禁止查询类实例
在FROM子句中使用“OBJECTS”关键字可以禁止OQL把查询的范围解释为对象实例,如:
SELECT * FROM OBJECTS java.lang.String
这个查询的结果不是返回快照中所有的字符串,而是只有一个对象,也就是java.lang.String类对应的Class对象。