ASTParser - MethodInvocation - 如何检测静态方法调用
ASTParser - MethodInvocation - How to detect a static method call
示例代码:
String.valueOf("test");
此代码的访问者:
cu.accept(new ASTVisitor()
{
public boolean visit(MethodInvocation inv)
{
System.out.println(inv);
System.out.println(inv.getExpression().getClass());
return true;
}
});
输出:
String.valueOf("test")
class org.eclipse.jdt.core.dom.SimpleName
但非静态调用也会 return SimpleName。
其次,我尝试获取 resolveMethodBinding(),但这里没有任何方法可以帮助我检测是否是静态方法。
有人知道这样做吗?谢谢
您需要使用可用的绑定构建 AST,然后调用:
IMethodBinding binding = inv.resolveMethodBinding();
if (binding.getModifiers() & Modifier.STATIC > 0) {
// method is static method
} else {
// method is not static
}
像这样区分静态调用(而不是静态方法):
myInteger.toString(); // Non-static call
Integer.toString(myInteger); // Static call
myInteger.toString(myInteger); // Non-static call (called from an object)
您需要使用可用的绑定构建 AST 并编写:
cu.accept(new ASTVisitor()
{
public boolean visit(MethodInvocation inv)
{
if (inv.getExpression() instanceof Name
&& ((Name) inv.getExpression()).resolveBinding().getKind() == IBinding.TYPE)
{
// Static call
}
else
{
// Non-static call
}
return true;
}
});
示例代码:
String.valueOf("test");
此代码的访问者:
cu.accept(new ASTVisitor()
{
public boolean visit(MethodInvocation inv)
{
System.out.println(inv);
System.out.println(inv.getExpression().getClass());
return true;
}
});
输出:
String.valueOf("test")
class org.eclipse.jdt.core.dom.SimpleName
但非静态调用也会 return SimpleName。
其次,我尝试获取 resolveMethodBinding(),但这里没有任何方法可以帮助我检测是否是静态方法。
有人知道这样做吗?谢谢
您需要使用可用的绑定构建 AST,然后调用:
IMethodBinding binding = inv.resolveMethodBinding();
if (binding.getModifiers() & Modifier.STATIC > 0) {
// method is static method
} else {
// method is not static
}
像这样区分静态调用(而不是静态方法):
myInteger.toString(); // Non-static call
Integer.toString(myInteger); // Static call
myInteger.toString(myInteger); // Non-static call (called from an object)
您需要使用可用的绑定构建 AST 并编写:
cu.accept(new ASTVisitor()
{
public boolean visit(MethodInvocation inv)
{
if (inv.getExpression() instanceof Name
&& ((Name) inv.getExpression()).resolveBinding().getKind() == IBinding.TYPE)
{
// Static call
}
else
{
// Non-static call
}
return true;
}
});