2012-12-04 68 views
0

我有一個對象VMemRead的實例(我們稱之爲r)。對於VMemRead的構造看起來像JAVA:如何訪問另一個對象的子類?

VMemRead(SourcePos sourcePos, VVarRef dest, VMemRef source) 

與領域destsource。我知道當我想要訪問dest時,我只能做r.dest。但是,我想要「更深入」來源。

VMRef有兩個嵌套類VMemRef.GlobalVMemRef.Stack。 VMemRef.Global有構造函數

VMemRef.Global(SourcePos sourcePos, VAddr<VDataSegment> base, int byteOffset) 

我想訪問int byteOffset。實際上,我想要做類似r.source.Global.byteOffset但Java不會讓我這樣做。

有什麼方法可以訪問該值?

文檔: VMemRead:http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRead.html#source

VMemRef:http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRef.html

VMemRef.Global:http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRef.Global.html

非常感謝您!

+4

格式的問題,並格式化好,不只是一巴掌周圍的話 –

+0

隨機碼塊怎麼會這樣?我認爲我將代碼標記爲適當的代碼。 – pauliwago

+0

另外我很困惑你的意思是嵌套?內部類或者通過說'extends VMemRef' ...從字面上擴展它...?因爲說'r.source.Global.byteOffset'肯定是錯的,不管它是哪一種方式。只是不知道你到底是哪一個人。 – Andy

回答

1

這些嵌套類是靜態的。對於它們中的每一個,都需要對實例的引用才能訪問字段值。 VMemRef的實例沒有(記錄的) VMemRef.GlobalVMemRef.Stack類型的成員字段。您必須在 r以外的其他地方查找來自這些類別的數據。

換句話說,只是因爲你有一個 rVMemRef例如,它並不意味着也有 VMemRef.GlobalVMemRef.Stack周圍的任何實例。所以沒有辦法訪問「那些價值」,因爲「那些價值」不一定存在!

編輯後重新閱讀API,我看到VMemRef是一個抽象類,r.source或者是VMemRef.GlobalVMemRef.Static的一個實例。這改變了故事。你可以做這樣的事情:

if (r.source instanceof VMemRef.Global) { 
    VMemRef.Global source = (VMemRef.Global) r.source; 
    // access fields specific to VMemRef.Global 
} else if (r.source instanceof VMemRef.Stack) { 
    VMemRef.Stack source = (VMemRef.Stack) r.source; 
    // access fields specific to VMemRef.Stack 
} 
+0

感謝您的幫助!這實際上很有意義,但是當我打印出'r.source「時打印出的是什麼。toString()'然後呢? – pauliwago

+0

@pauliwago - 啊。它看起來像你從來沒有'VMemRef'的實例;它總是一個'VMemRef.Global'或'VMemRef.Stack'的實例。我更新了我的答案,以說明如何處理這個問題。 –

+0

非常感謝!這樣做:) – pauliwago