2012-12-04 65 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