`
liwei113114
  • 浏览: 14371 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Eclipse AST生成java源代码(一)

阅读更多

一、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");

需要注意的几点:

  1. AST ast = AST.newAST(AST.JLS3);AST.JLS3为版本,如果生成的代码中用到try的话,要用AST.JLS4这个版本
  2. println.setExpression(ast.newName("System.out"));如果只是调用某个变量的方法,参数可以用ast.newSimpleName和ast.newName,如果中间的表达式很复杂,会出现一些java变量定义不允许的字符,就必须用ast.newName。Name和SimpleName都是从Expression中继承而来,所以只要用到Expression的地方,都可以直接用ast.newName。
  3. 所有的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参数。

0
0
分享到:
评论

相关推荐

    基于Eclipse-JDT生成Java源代码的AST并可视化.zip

    总结来说,"基于Eclipse-JDT生成Java源代码的AST并可视化"的主题涉及了使用Eclipse JDT的API解析Java代码,构建AST,以及通过可视化工具理解AST结构。这一过程对于软件开发、代码审查和维护都具有重要意义,能够帮助...

    Eclipse AST分析java源码.doc

    Eclipse的抽象语法树(Abstract Syntax Tree,简称AST)是Java源码解析的重要工具,它将源代码转换为一种结构化的表示形式,便于对代码进行分析、修改和生成。在给定的问题中,用户希望利用Eclipse AST分析Java源码...

    eclipse ast开发库

    Eclipse AST开发库是Eclipse Java Development Tools (JDT) 插件的一部分,它提供了一组强大的工具,用于处理和分析Java源代码。这个库的核心功能是构建和操作Java程序的抽象语法树(Abstract Syntax Tree,AST)。...

    eclipse cdt 解析C++ AST

    6. 根据AST生成的信息会被索引器收集,并将索引数据存储起来供后续的快速查询使用。 7. 用户在编写代码时,可以通过触发特定的命令(如“打开声明”),CDT会查询索引文件并找到声明的位置。 8. 当代码文件被修改...

    AST解析java源文件相关jar包

    它包含了用于解析、操作和生成Java源代码的类,包括构建AST的工具。通过JDT,你可以实现诸如提取类信息、查找特定方法、分析类型关系等功能。 Javassist则是另一个流行的Java字节码操作库,它不仅可以用来动态生成...

    AST和Java Model.zip

    通过使用这些API,开发者可以方便地构建、解析和操作AST,从而实现对Java源代码的深度操作。例如,你可以使用ASTVisitor来遍历AST,并根据需要修改各个节点。 **Java Model** Java Model是JDT中的另一个重要组成...

    Eclipse AST

    Eclipse AST(Abstract Syntax Tree,抽象语法树)是Eclipse JDT(Java Development Tools)的重要组成部分之一,主要用于表示Java源代码的语法结构。它位于`org.eclipse.jdt.core.dom`包内,提供了强大的功能来帮助...

    JavaCC语法分析器 基于Eclipse插件 能从文件读取源代码输出语法树

    在这个项目中,JavaCC生成的解析器被封装为一个Eclipse插件,用户可以直接在Eclipse内处理源代码,查看其对应的语法树,这对于理解和调试代码非常有帮助。 Test.java是测试类,通常包含用于验证解析器功能的代码。...

    java源代码编译java源代码编译

    在大型项目中,Java源代码通常使用版本控制系统(如Git)管理,并遵循模块化设计(如Java 9引入的模块系统)来组织代码结构。 10. **优化编译策略** 开发者可以通过设置JVM参数调整编译策略,例如设置JIT编译的...

    java编译器源代码.rar

    Java编译器源代码是Java开发的核心组成部分,它将人类可读的Java源代码转换为计算机可执行的字节码。这个压缩包“java编译器源代码.rar”很可能包含了JDK(Java Development Kit)中的Javac编译器的源代码。Javac是...

    AST整理.txt学习JDT的AST相关网站和资料收集

    而AST则是Eclipse JDT中一个非常重要的概念,它是Java源代码的一种内部表示形式,可以被用来分析和修改程序结构。 ##### 2.1 AST基本概念 - **AST**:抽象语法树是一种树形的数据结构,它表示程序的语法结构。在...

    java代码行数统计源码

    总之,"java代码行数统计源码"提供的工具是一个实用的开发辅助程序,它综合运用了Java的文件操作、源代码解析、数据处理和可能的用户界面设计等多个技术领域,为开发者提供了一种量化评估项目规模的方式。通过对源...

    javac1.7源代码(完全版,可运行)

    Java编译器(javac)是Java开发工具包(JDK)的核心组件,负责将Java源代码转换为可执行的字节码。本资源提供的"javac1.7源代码"是一个完全版,包含了OpenJDK 1.7版本中的javac编译器的源代码。OpenJDK是一个开源...

    eclipse编译java源码-argFetExt:这是一个蚀项目,该项目从已编译的Java源代码中收集AST信息,以提取特征以进行参数推荐

    在argFetExt项目中,开发者可能使用了Eclipse的JDT库来解析Java源代码,获取AST,并通过特定的算法分析这些AST节点,提取出与参数相关的特征。 参数推荐是软件开发中的一个重要环节,它可以帮助开发者自动填充方法...

    java源码uml-UMLParser:解析器将Java源代码转换为UML图

    UML解析器此项目是一个UML解析器,它将Java源代码转换为UML图。 该项目中使用的工具和库是: Java解析器 它包括用于从Java源代码解析类,变量,方法和构造函数的类和接口。 用于该项目的Java解析器是:该程序包包含...

    javaparser-1.0.8-src.zip

    3. **代码生成**:通过修改AST,JavaParser还支持生成新的Java源代码。这对于自动化代码生成、模板引擎或者元编程任务是必不可少的。 4. **教育工具**:JavaParser也可用于教学,帮助学生理解编译原理和Java语法...

    windowbuilder eclipse设置

    通过直观的拖放操作,开发者能够轻松构建基于 Swing 或 SWT 的应用程序界面,并自动生成相应的 Java 代码。这不仅减少了手动编码的工作量,还提高了代码的质量和可维护性。 #### 二、WindowBuilder 的使用方法 ####...

    JDT生成代码实例

    在Java开发中,Eclipse JDT (Java Development Toolkit) 是一个强大的工具,它提供了对Java源代码的抽象语法树(AST, Abstract Syntax Tree)表示,使得我们可以方便地生成、解析和修改Java代码。本示例展示了如何使用...

    Eclipse_UML建模插件开发

    在Java中,AST能够将Java源代码文件分解成一个由节点组成的树形结构,每个节点代表源代码中的一个构造(如类、方法、语句等)。JDT的AST API允许开发者遍历AST,搜索特定的构造,创建和修改AST节点,从而支持代码的...

Global site tag (gtag.js) - Google Analytics