如何用JavaParser修改方法内String变量值为空字符串
修改JavaParser中方法内局部String变量的值
你已经搞定了类级String变量的修改,现在卡在方法内的局部变量,其实只要针对两种常见场景处理就行——变量声明时的初始化赋值和后续的赋值操作,我来给你补全代码逻辑:
首先,你需要区分当前语句是变量声明还是普通赋值,同时要准确判断变量是不是String类型(避免误改其他类型的字符串赋值)。这里推荐用JavaParser的符号解析功能来确认变量类型,这样更准确。
完整修改后的代码
import com.github.javaparser.StaticJavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.BodyDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.TypeDeclaration; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.ExpressionStmt; import com.github.javaparser.ast.expr.NameExpr; import com.github.javaparser.ast.expr.StringLiteralExpr; import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.ast.stmt.Statement; import com.github.javaparser.ast.stmt.VariableDeclarationStmt; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; public class StringModifier { static void removeStrings(CompilationUnit cu) { // 配置符号解析器,用于准确判断变量类型 JavaSymbolSolver symbolSolver = new JavaSymbolSolver(new ReflectionTypeSolver()); cu.setSymbolResolver(symbolSolver); for (TypeDeclaration typeDec : cu.getTypes()) { var members = typeDec.getMembers(); if (members == null) continue; for (BodyDeclaration member : members) { if (member.isMethodDeclaration()) { MethodDeclaration method = member.asMethodDeclaration(); var block = method.getBody(); if (block.isEmpty()) continue; var statements = block.get().getStatements(); for (Statement tmp : statements) { // 场景1:处理变量声明时的初始化(比如 String str = "old";) if (tmp.isVariableDeclarationStmt()) { VariableDeclarationStmt varDecl = tmp.asVariableDeclarationStmt(); // 判断变量类型为String if (varDecl.getType().asString().equals("String")) { // 遍历所有变量初始化器,替换为空字符串 varDecl.getVariables().forEach(variable -> { variable.setInitializer(new StringLiteralExpr("")); }); } } // 场景2:处理后续的赋值操作(比如 str = "new";) if (tmp.isExpressionStmt()) { ExpressionStmt exprStmt = tmp.asExpressionStmt(); if (exprStmt.getExpression().isAssignExpr()) { AssignExpr assignExpr = exprStmt.getExpression().asAssignExpr(); // 确保左边是变量引用 if (assignExpr.getTarget().isNameExpr()) { NameExpr varName = assignExpr.getTarget().asNameExpr(); try { // 解析变量的实际类型 ResolvedType resolvedType = varName.resolve().getType(); if (resolvedType.describe().equals("java.lang.String")) { // 替换赋值内容为空字符串 assignExpr.setValue(new StringLiteralExpr("")); } } catch (Exception e) { // 解析失败(比如变量未定义等特殊情况)时跳过 continue; } } } } } } } } } }
关键逻辑说明
- 符号解析器配置:通过
JavaSymbolSolver和ReflectionTypeSolver解析变量的实际类型,避免仅通过变量名判断的误差,比如能区分同名但不同类型的变量。 - 变量声明处理:识别
VariableDeclarationStmt类型语句,判断变量类型为String后,直接替换所有变量的初始化表达式为空字符串。 - 赋值语句处理:识别
ExpressionStmt中的AssignExpr,通过符号解析确认变量是String类型后,替换赋值的右侧表达式为空字符串。
这样就能覆盖方法内所有局部String变量的修改啦~
内容的提问来源于stack exchange,提问作者undisp
相关产品推荐
相关产品推荐

