我正在使用JDT的AST来解析Java文件,我正在尝试弄清楚如何识别在方法调用期间传递给方法的参数的类型。
目前,我使用VariableDeclarationFragment将任何变量的类型存储在HashMap中的方法中。当发生方法调用(使用MethodInvocation标识)时,我搜索在HashMap中作为参数传递的变量,以确定其类型。
例如,如果我有类似的东西:
int x = 7;
M1(x);
在HashMap中的我存储映射到int的x。当调用方法M1时,我检查x的类型是什么,并根据需要使用它。
我的问题是,这在
等调用中不起作用 M1(7)
有没有办法用AST确定'7'的类型?
答案 0 :(得分:0)
正如您在评论中提到的,您必须使用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
还是别的。
P.S。上面的树表示是使用ASTView plug-in制作的,这对于使用AST非常有帮助,所以如果你还没有它,我建议你这样做。