我正在编写自定义 lint 检查来禁止某些方法。因此,如果有人在类
foo
的实例上调用被禁止的方法 A
,lint 应该报告错误。
我通过这样的静态方法实现了这一点(在
visitCallExpression(UCallExpression)
中:
node.receiver as UReferenceExpression).getQualifiedName()
从限定名称中,我可以获取
Class
对象并运行我的检查,但我无法获取在实例化对象上调用的方法的限定名称。我可以获取对象所属类的名称,但不能获取限定名称。
如何获取在该类的实例上调用的方法的类的限定名称?如果我不清楚,这里有一个例子。
import android.view.Button;
class ButtonSetTextIntClass {
private Button button;
public void bannedSetText (){
button.setText(123);
}
}
我需要在
visitCallExpression (UCallExpression)
获得 button
的合格名称/类别。
UCallExpression.receiverType
做你想做的事:
public class CustomDetector extends Detector implements SourceCodeScanner {
@Nullable
@Override
public List<Class<? extends UElement>> getApplicableUastTypes() {
return Collections.singletonList(UCallExpression.class);
}
@Nullable
@Override
public UElementHandler createUastHandler(@NotNull JavaContext context) {
return new UElementHandler() {
@Override
public void visitCallExpression(@NotNull UCallExpression node) {
node.getReceiverType(); // PsiType:Button
}
};
}
}
要提取限定名称,您可以使用以下方法:
((PsiClassType) node.getReceiverType()).resolve().getQualifiedName() // android.widget.Button
我找到了一个适用于静态和非静态方法以及 Kotlin 顶级函数的解决方案。不确定这是否是“最好”的方法,但至少它有效。
override fun visitCallExpression(node: UCallExpression) {
(node.resolve()?.parent as? ClsClassImpl)?.stub?.qualifiedName
}
(node.returnType as? PsiClassType)?.resolve()?.qualifiedName)
它又回来了
com.google.android.material.button.MaterialButton