我正在玩JavaParser,我正在寻找一种过滤所有System.out.println()的方法;
我可以通过以下方法来实现
public class SystemOutFilter extends ModifierVisitorAdapter{
@Override
public Node visit(ExpressionStmt n, Object arg) {
if(isSystemOut(n)){
return null;
}
return super.visit(n, arg);
}
private boolean isSystemOut(ExpressionStmt n){
if(n.getExpression() instanceof MethodCallExpr){
MethodCallExpr methodExpr = (MethodCallExpr) n.getExpression();
if(methodExpr.getScope() instanceof FieldAccessExpr){
FieldAccessExpr fieldExpr = (FieldAccessExpr) methodExpr.getScope();
NameExpr nameExpr = (NameExpr) fieldExpr.getScope();
if(nameExpr.getName().equals("System") && fieldExpr.getField().equals("out")){
return true;
};
}
}
return false;
}
private boolean isSystemOut_1(ExpressionStmt n){
NameExpr clazz = new NameExpr("System");
FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
MethodCallExpr method = new MethodCallExpr(field, "println");
if(n.getExpression() instanceof MethodCallExpr){
MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
if(inputExpr.getName().equals(method.getName()) && inputExpr.getScope().equals(method.getScope()))
return true;
}
return false;
}
private boolean isSystemOut_2(ExpressionStmt n) {
NameExpr clazz = new NameExpr("System");
FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
MethodCallExpr method = new MethodCallExpr(field, "println");
if(n.getExpression() instanceof MethodCallExpr){
MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
method.setArgs(inputExpr.getArgs());
return inputExpr.equals(method);
}
return false;
}
private boolean isSystemOut_3(ExpressionStmt n){
try{
Statement expr = JavaParser.parseStatement("System.out.println();");
if(expr instanceof ExpressionStmt) {
ExpressionStmt methodStmt = (ExpressionStmt) expr;
if (n.getExpression() instanceof MethodCallExpr) {
MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
MethodCallExpr methodExpr = (MethodCallExpr) methodStmt.getExpression();
methodExpr.setArgs(inputExpr.getArgs());
return inputExpr.equals(methodExpr);
}
}
}catch(ParseException pe){
pe.printStackTrace();
}
return false;
}
}我不喜欢这个解决方案,因为我每次都需要创建一个新的MethodExpression来匹配参数。我想创建一个静态的最终MethodExpression,并将输入参数与常量进行比较。
就像这样
private static final ExpressionStmt systemOutExpr = (ExpressionStmt)JavaParser.parseStatement("System.out.println();");
private boolean isSystemOut(ExpressionStmt n){
return n.match(systemOutExpr).withArgs(Matchers.any());
}有没有办法在equals方法之外比较JParser中的语句?
发布于 2017-01-09 10:40:35
我不确定我是否准确地理解了您要实现的目标,但我认为这将是一种过滤System.out.println("anythingHere")的方法,您可以使用MethodCallExpr。如下所示:
public void visit(MethodCallExpr n, Object a) {
boolean isIt = isItSOP(n);
super.visit(n, a);
}
private boolean isItSOP(MethodCallExpr n) {
Node child = n.getChildrenNodes().get(0);
String sChild=child.toString();
if(sChild.equals("System.out")&&n.getName().equals("println")){
return true;
}
return false;
}`https://stackoverflow.com/questions/39056717
复制相似问题