如何使用JavaParser在方法的try语句前插入指定代码?
解决JavaParser生成代码时变量声明位置问题
问题描述
使用com.github.javaparser生成Java代码时,需要将String result = null;放置在try语句块之前,但当前代码将其插入到了try语句内部,不符合预期的代码结构。
依赖版本
当前使用的JavaParser依赖:
<!-- https://mvnrepository.com/artifact/com.github.javaparser/javaparser-core --> <dependency> <groupId>com.github.javaparser</groupId> <artifactId>javaparser-core</artifactId> <version>3.24.4</version> </dependency>
解决方案
核心是调整语句的添加顺序和目标容器:
- 找到目标方法的
MethodDeclaration对象,获取其方法体BlockStmt; - 先创建
String result = null;对应的变量声明语句,添加到方法体的语句列表头部; - 再构建try-catch语句块,添加到方法体的语句列表中(位于变量声明之后)。
关键代码示例:
// 假设已获取目标方法对象methodDecl BlockStmt methodBody = methodDecl.getBody().get(); // 创建result变量声明语句 VariableDeclarationExpr resultVar = new VariableDeclarationExpr( new ReferenceType("String", false), new VariableDeclarator(new SimpleName("result"), new NullLiteral()) ); // 将变量声明插入到方法体最前面 methodBody.addStatement(0, resultVar); // 构建try块内的业务语句 BlockStmt tryBlock = new BlockStmt(); tryBlock.addStatement("createMyProduct.setProduct(productDto.getProduct());"); tryBlock.addStatement("createMyProduct.execute(parameterMap);"); tryBlock.addStatement("result = createMyProduct.getResult();"); // 构建catch块逻辑 CatchClause catchClause = new CatchClause(); catchClause.setParameter(new Parameter(new ReferenceType("BusinessException", false), new SimpleName("e"))); BlockStmt catchBlock = new BlockStmt(); catchBlock.addStatement("return Response.status(Response.Status.BAD_REQUEST).entity(result).build();"); catchClause.setBody(catchBlock); // 组装try语句并添加到方法体 TryStmt tryStmt = new TryStmt(); tryStmt.setTryBlock(tryBlock); tryStmt.addCatchClause(catchClause); methodBody.addStatement(tryStmt);
预期生成代码
public Response saveProduct(ProductDto productDto) throws ServletException, IOException { String result = null; try { createMyProduct.setProduct(productDto.getProduct()); createMyProduct.execute(parameterMap); result = createMyProduct.getResult(); } catch (BusinessException e) { return Response.status(Response.Status.BAD_REQUEST).entity(result).build(); } }
内容的提问来源于stack exchange,提问作者Gulam Samdani
相关产品推荐
相关产品推荐

