我正在使用JDT的AST来解析Java文件,目前正在尝试弄清楚如何在方法调用期间识别传递给方法的参数的类型。
目前,我使用 VariableDeclarationFragment 将任何变量的类型存储在 HashMap 的方法中。 当方法调用发生(使用 MethodInvocation 标识)时,我在 HashMap 中搜索作为参数传递的变量,以确定其类型。
例如,如果我有这样的东西:
int x = 7;
M1(x);
在 HashMap 中,我存储了映射到 int 的 x。 当调用方法 M1 时,我检查 x 的类型是什么,并根据需要使用它。
我的问题是这在像这样的调用中不起作用
M1(7)
有没有办法使用 AST 确定"7"的类型?
正如您在评论中提到的,您必须使用 resolveTypeBindings()
.
M1(7)
将表示为:
ExpressionStatement [655, 6]
EXPRESSION
MethodInvocation [655, 5]
> (Expression) type binding: void
> method binding: Main.M1(int)
ResolvedTypeInferredFromExpectedType: false
Boxing: false; Unboxing: false
ConstantExpressionValue: null
EXPRESSION: null
TYPE_ARGUMENTS (0)
NAME
ARGUMENTS (1)
NumberLiteral [658, 1]
> (Expression) type binding: int
Boxing: false; Unboxing: false
ConstantExpressionValue: 7
TOKEN: '7'
因此,通过ExpressionStatement
你会发现它有Expression
哪个是MethodInvocation
然后你可以得到它的参数,它将被NumberLiteral
,然后你可以使用resolveTypeBindings()
注意:在评论中,您被告知检查它是否NumberLiteral
并假设它是数字。是的,这是真的,这是一个数字,但你不会知道它的类型;无论是int
还是double
或其他什么。
附言上面的树表示是使用 ASTView 插件制作的,该插件在与 AST 配合使用时非常有用,因此如果您还没有它,我建议您获取它。