java中parser_JavaParser:Java代码生成

在本文中,我将向您展示如何使用...生成Java代码JavaParser。我在javaparser.org或手册中找不到关于代码生成的大量文档。因此,我认为将其解决将有助于想要尝试使用Java解析器的人。

在最简单的形式中,  JavaParser 库允许您与Java源代码交互,作为Java环境中的Java对象表示。更正式地说,我们将此对象表示称为抽象语法树(AST)。此外,它还能够操纵源代码的底层结构。然后可以将其写入文件,为开发人员提供构建自己的代码生成软件的工具。

首先,您必须实例化编译单元,然后在其上添加剩余的代码片段。

CompilationUnit compilationUnit = new CompilationUnit();

然后,您可以将import语句添加到编译单元,此处:

compilationUnit.addImport("org.springframework.boot.SpringApplication");

您可以将package语句添加到编译单元,如下所示:

compilationUnit.setPackageDeclaration("com.abc.def");

您可以将类声明添加到Java文件中:

ClassOrInterfaceDeclaration classDeclaration = compilationUnit.addClass("AnyClassName").setPublic(true);

如果要在类级别添加注释,可以使用以下代码:

classDeclaration.addAnnotation("AnyAnnotation");

您可以在新声明的类中添加方法声明,如下所示:

MethodDeclaration methodDeclaration = classDeclaration.addMethod("anyMethodName", PUBLIC);

methodDeclaration.setType("AnyReturnType");

您可以为新创建的方法声明添加参数:

methodDeclaration.addAndGetAnnotation("AnyAnnotation");

在新声明的方法之上添加注释:

BlockStmt blockStmt = new BlockStmt();

methodDeclaration.setBody(blockStmt);

要在新声明的方法中添加方法logic / block语句,请使用以下代码:

BlockStmt  blockStmt  =  new  BlockStmt();

methodDeclaration。setBody(blockStmt);

要在方法/块语句中声明和实例化变量,请使用以下代码:

ExpressionStmt expressionStmt = new ExpressionStmt();

VariableDeclarationExpr variableDeclarationExpr = new VariableDeclarationExpr();

VariableDeclarator variableDeclarator = new VariableDeclarator();

variableDeclarator.setName("anyVariableName");

variableDeclarator.setType(new ClassOrInterfaceType("AnyVariableType"));

variableDeclarator.setInitializer("new AnyVariableType()");

NodeList variableDeclarators = new NodeList<>();

variableDeclarators.add(variableDeclarator);

variableDeclarationExpr.setVariables(variableDeclarators);

expressionStmt.setExpression(variableDeclarationExpr);

blockStmt.addStatement(expressionStmt);

要调用方法/块语句中创建的新变量的方法,请使用以下代码:

NameExpr nameExpr = new NameExpr("anyVariableName");

MethodCallExpr methodCallExpr = new MethodCallExpr(nameExpr, "anyMethodName");

methodCallExpr.addArgument("anyArgument");

blockStmt.addStatement(methodCallExpr);

要返回在方法中创建的变量,请使用以下代码:

ReturnStmt returnStmt = new ReturnStmt();

NameExpr returnNameExpr = new NameExpr();

returnNameExpr.setName("anyVariableName");

returnStmt.setExpression(returnNameExpr);

blockStmt.addStatement(returnStmt);

要打印上面生成的代码,只需调用toString 编译单元的  方法:

String code = compilationUnit.toString();

要使用多值键值对添加注释,请使用以下代码。

NodeList annotationParamValueList = new NodeList<>();

annotationParamValueList.add(new StringLiteralExpr("Value1");

annotationParamValueList.add(new StringLiteralExpr("Value2");

ArrayInitializerExpr annotationParamValueArrayInitializerExpr = new ArrayInitializerExpr(annotationParamValueList);

Name annotationName = new Name("AnyAnnotationName");

NodeList annotationParamList = new NodeList<>();

MemberValuePair memberValuePair = new MemberValuePair();

memberValuePair.setName(new SimpleName("AnyValue"));

memberValuePair.setValue(annotationParamValueArrayInitializerExpr);

annotationParamList.add(memberValuePair);

AnnotationExpr annotationExpr = new NormalAnnotationExpr(annotationName, annotationParamList);

另外本人从事在线教育多年,将自己的资料整合建了一个公众号,对于有兴趣一起交流学习java可以微信搜索:“程序员文明”,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!

java精神(基于函数式组合子逻辑的javaparser框架) 一。 释名。 为什么叫精神? 如果你熟悉c++,那么你可能知道一个叫做”spirit”的parser库。它利用c++的模板元编程能力,使用c++语言本身提供了一个递归下降文法解析的框架。 我这里介绍的jparsec库,就是一个java里面的递归下降文法解析框架。 不过,它并非是spirit的java版本。 Jparsec的蓝本来自Haskell语言的parsec库。Parsec是一个基于monad的parser组合子库。 这个库的目的是要在java提供一个类似parsec, spirit的库,这种组合子库并非c++的专利,java/c#也可以做到。这个库还将在java5.0上被改写,类型安全上它将也不再逊色于c++。 那么,为什么叫“函数式”呢?java是面向对象的嘛。 如果你使用过haskell, lisp等语言,这个函数式不用解释你也知道是怎么回事了。 如果你是一个老牌的c++/java程序员,那么这里还要稍微解释一下。当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,不知道什么是“函数式”,并不会影响你对这个库的理解的。 C++这几年随着gp的普及,“函数式”这个老孔乙己逐渐又被人从角落里面拽了出来。一个c++程序员所熟悉的“函数式”很可能是stl的for_each, transform,count_if这些函数。 怎么说呢,就象我不能否定str.length()这个调用属于OO一样,我也无法说for_each, transform不是函数式。 但是,“函数式”的精髓不在于此。 一般归纳起来,就像我们说OO是什么多态,封装,继承一样,“函数式”的特征被总结为: 1。无副作用。 2。高阶函数。 3。延迟计算 而最最有意义的(至少我认为如此),是基于高阶函数的函数组合能力。一些人把这叫做glue。 简短地说,什么让函数式编程如此强大?是用简单的函数组合出复杂函数的能力。 我可以想象,说到这里,你还是一头雾水。“什么是组合?1+1不是也把两个1组合成2了吗?new A(new B(), new C())不也是从B和C组合成A了?”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值