一、AST版“Hello World”
public class HelloWorld {
public static void main(String[] args) {
AST ast = AST.newAST(AST.JLS3);
CompilationUnit compilationUnit = ast.newCompilationUnit();
// 创建类
TypeDeclaration programClass = ast.newTypeDeclaration();
programClass.setName(ast.newSimpleName("HelloWorld"));
programClass.modifiers().add(
ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
compilationUnit.types().add(programClass);
// 创建包
PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
packageDeclaration.setName(ast.newName("com.dream"));
compilationUnit.setPackage(packageDeclaration);
MethodDeclaration main = ast.newMethodDeclaration();
main.setName(ast.newSimpleName("main"));
main.modifiers().add(
ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
main.modifiers().add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));
main.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
programClass.bodyDeclarations().add(main);
Block mainBlock = ast.newBlock();
main.setBody(mainBlock);
// 给main方法定义String[]参数
SingleVariableDeclaration mainParameter = ast
.newSingleVariableDeclaration();
mainParameter.setName(ast.newSimpleName("arg"));
mainParameter.setType(ast.newArrayType(ast.newSimpleType(ast
.newName("String"))));
main.parameters().add(mainParameter);
MethodInvocation println=ast.newMethodInvocation();
println.setName(ast.newSimpleName("prinln"));
//生成String类型的常量
StringLiteral s=ast.newStringLiteral();
s.setLiteralValue("Hello World");
println.arguments().add(s);
println.setExpression(ast.newName("System.out"));
mainBlock.statements().add(ast.newExpressionStatement(println));
System.out.println(compilationUnit.toString());
}
}
上面的代码只是生成了一个只有一个main方法的类,并且main方法里面只有一行System.out.println("Hello World");
需要注意的几点:
-
AST ast = AST.newAST(AST.JLS3);AST.JLS3为版本,如果生成的代码中用到try的话,要用AST.JLS4这个版本
-
println.setExpression(ast.newName("System.out"));如果只是调用某个变量的方法,参数可以用ast.newSimpleName和ast.newName,如果中间的表达式很复杂,会出现一些java变量定义不允许的字符,就必须用ast.newName。Name和SimpleName都是从Expression中继承而来,所以只要用到Expression的地方,都可以直接用ast.newName。
-
所有的import都要自己手动加入,本例中没有。
二、用AST解析java源代码。
ASTParser parsert = ASTParser.newParser(AST.JLS4);
String contents = "public class T{public void t(){Object o;o=System.out;}}";
parsert.setSource(contents.toCharArray());
// 使用解析器进行解析并返回AST上下文结果(CompilationUnit为根节点)
CompilationUnit result = (CompilationUnit) parsert.createAST(null);
TypeDeclaration type = (TypeDeclaration) result.types().get(0);
MethodDeclaration method = type.getMethods()[0];
ExpressionStatement ifs = (ExpressionStatement) method.getBody().statements().get(1);
Assignment expression=(Assignment)ifs.getExpression();
Expression exp=expression.getRightHandSide();
在ast中,所有的节点开成一个树,根节点为ast对象,根节点不同的两个节点不能互相添加。所以如果你想把解析出来的节点加到你自己生成的节点上,那你只有去改源代码了。在CompilationUnitResolver类的convert中的276行AST ast = AST.newAST(apiLevel);它每次都会新建一个AST,修改的办法就是重载一下这个方法,加一个AST参数。
分享到:
相关推荐
总结来说,"基于Eclipse-JDT生成Java源代码的AST并可视化"的主题涉及了使用Eclipse JDT的API解析Java代码,构建AST,以及通过可视化工具理解AST结构。这一过程对于软件开发、代码审查和维护都具有重要意义,能够帮助...
Eclipse的抽象语法树(Abstract Syntax Tree,简称AST)是Java源码解析的重要工具,它将源代码转换为一种结构化的表示形式,便于对代码进行分析、修改和生成。在给定的问题中,用户希望利用Eclipse AST分析Java源码...
Eclipse AST开发库是Eclipse Java Development Tools (JDT) 插件的一部分,它提供了一组强大的工具,用于处理和分析Java源代码。这个库的核心功能是构建和操作Java程序的抽象语法树(Abstract Syntax Tree,AST)。...
6. 根据AST生成的信息会被索引器收集,并将索引数据存储起来供后续的快速查询使用。 7. 用户在编写代码时,可以通过触发特定的命令(如“打开声明”),CDT会查询索引文件并找到声明的位置。 8. 当代码文件被修改...
它包含了用于解析、操作和生成Java源代码的类,包括构建AST的工具。通过JDT,你可以实现诸如提取类信息、查找特定方法、分析类型关系等功能。 Javassist则是另一个流行的Java字节码操作库,它不仅可以用来动态生成...
通过使用这些API,开发者可以方便地构建、解析和操作AST,从而实现对Java源代码的深度操作。例如,你可以使用ASTVisitor来遍历AST,并根据需要修改各个节点。 **Java Model** Java Model是JDT中的另一个重要组成...
Eclipse AST(Abstract Syntax Tree,抽象语法树)是Eclipse JDT(Java Development Tools)的重要组成部分之一,主要用于表示Java源代码的语法结构。它位于`org.eclipse.jdt.core.dom`包内,提供了强大的功能来帮助...
在这个项目中,JavaCC生成的解析器被封装为一个Eclipse插件,用户可以直接在Eclipse内处理源代码,查看其对应的语法树,这对于理解和调试代码非常有帮助。 Test.java是测试类,通常包含用于验证解析器功能的代码。...
在大型项目中,Java源代码通常使用版本控制系统(如Git)管理,并遵循模块化设计(如Java 9引入的模块系统)来组织代码结构。 10. **优化编译策略** 开发者可以通过设置JVM参数调整编译策略,例如设置JIT编译的...
Java编译器源代码是Java开发的核心组成部分,它将人类可读的Java源代码转换为计算机可执行的字节码。这个压缩包“java编译器源代码.rar”很可能包含了JDK(Java Development Kit)中的Javac编译器的源代码。Javac是...
而AST则是Eclipse JDT中一个非常重要的概念,它是Java源代码的一种内部表示形式,可以被用来分析和修改程序结构。 ##### 2.1 AST基本概念 - **AST**:抽象语法树是一种树形的数据结构,它表示程序的语法结构。在...
总之,"java代码行数统计源码"提供的工具是一个实用的开发辅助程序,它综合运用了Java的文件操作、源代码解析、数据处理和可能的用户界面设计等多个技术领域,为开发者提供了一种量化评估项目规模的方式。通过对源...
Java编译器(javac)是Java开发工具包(JDK)的核心组件,负责将Java源代码转换为可执行的字节码。本资源提供的"javac1.7源代码"是一个完全版,包含了OpenJDK 1.7版本中的javac编译器的源代码。OpenJDK是一个开源...
在argFetExt项目中,开发者可能使用了Eclipse的JDT库来解析Java源代码,获取AST,并通过特定的算法分析这些AST节点,提取出与参数相关的特征。 参数推荐是软件开发中的一个重要环节,它可以帮助开发者自动填充方法...
UML解析器此项目是一个UML解析器,它将Java源代码转换为UML图。 该项目中使用的工具和库是: Java解析器 它包括用于从Java源代码解析类,变量,方法和构造函数的类和接口。 用于该项目的Java解析器是:该程序包包含...
3. **代码生成**:通过修改AST,JavaParser还支持生成新的Java源代码。这对于自动化代码生成、模板引擎或者元编程任务是必不可少的。 4. **教育工具**:JavaParser也可用于教学,帮助学生理解编译原理和Java语法...
通过直观的拖放操作,开发者能够轻松构建基于 Swing 或 SWT 的应用程序界面,并自动生成相应的 Java 代码。这不仅减少了手动编码的工作量,还提高了代码的质量和可维护性。 #### 二、WindowBuilder 的使用方法 ####...
在Java开发中,Eclipse JDT (Java Development Toolkit) 是一个强大的工具,它提供了对Java源代码的抽象语法树(AST, Abstract Syntax Tree)表示,使得我们可以方便地生成、解析和修改Java代码。本示例展示了如何使用...
在Java中,AST能够将Java源代码文件分解成一个由节点组成的树形结构,每个节点代表源代码中的一个构造(如类、方法、语句等)。JDT的AST API允许开发者遍历AST,搜索特定的构造,创建和修改AST节点,从而支持代码的...