2010-10-20 25 views
4

我有一個堆轉儲,我正在使用Eclipse MAT,但我認爲這應該通過visualvm或任何OQL客戶端工作。獲取OQL堆轉儲中類的靜態字段

我們可以做這樣的事情

select s.field1, s.field2 from org.me.MyClass 

選擇一類的所有實例的領域......但是這僅限於成員變量,和類型的實例。

如何選擇沒有實例的類的靜態字段?

這與this other question有些相關。

回答

4

要訪問類的靜態字段 '道具' java.lang.System中您可以使用(在VisualVM的)

select heap.findClass("java.lang.System").statics.props 
select heap.findClass("java.lang.System").props 
+0

優秀, 謝謝。這兩個工作。 'select heap.findClass(「java.lang.System」)。statics'給出了從字段名到值的映射,這很方便。 – 2010-12-16 15:42:42

+0

雖然這個問題沒有被要求,但值得注意的是,這不會在Eclipse MAT OQL中執行。 – 2010-12-16 15:49:58

4

這是一個有點hackish,但在MAT的工作原理:

SELECT c.SIZE 
FROM INSTANCEOF java.lang.Class c 
WHERE [email protected]("class java.lang.Integer ") 
+0

非常聰明,爲我工作,除了它也選擇內部類。我嘗試使用c。@ name,它在選擇列表中工作,但不在where子句中。在選擇列表中,「c」似乎是在where子句中的IClass(類的MAT表示),而它是java.lang.Class,它是如何工作的? – haridsv 2012-08-01 17:36:42