eclipse插件开发:使用AST生成类(源码)

本代码演示如何通过AST生成一个完整的类, 最终生成的代码比较乱, 编译无法通过,重点在于对AST的使用, 无需考虑最后生成的结果.

以下是最终生成的代码(语法有严重错误, 请不要计较这些):
package com.aptech.lzh;

import java.util.Date;
import java.util.Random;

public  class Program  {
    public static void main(String[] arg) {
        Program program = new Program();
        String r = program.getString("中国");
        System.out.println(r);
    }


    public Program(int a, int[] b, final Integer c) {
        super(null);
    }


    public String getString(String p) {
        String newString = new String("初始值");
        newString = "你好";
        String result = newString.indexOf("值");
        newString = name + "你好";
        return newString;
    }


    public String isOdd(int a) throws NullPointerException, Exception {
        if (a < 0)
            throw new Exception("数字不能为负数");
        if (a % 2 == 0)
            return "偶数";
        else {
            System.out.println("完");
            return "奇数";
        }

    }

}


源代码:
package ast.test.demo;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.PackageDeclaration;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
import org.eclipse.jdt.core.dom.ThrowStatement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.TypeLiteral;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jdt.core.dom.Assignment.Operator;
import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;

public  class Demo  {
    public static void main(String[] args) {
        AST ast = AST.newAST(AST.JLS3);
        CompilationUnit compilationUnit = ast.newCompilationUnit();
        
        //创建类
        TypeDeclaration programClass = ast.newTypeDeclaration();
        programClass.setName(ast.newSimpleName("Program"));
        programClass.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
        compilationUnit.types().add(programClass);

        //创建包
        PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
        packageDeclaration.setName(ast.newName("com.aptech.lzh"));
        compilationUnit.setPackage(packageDeclaration);
        
        //要导入的包
        String[] imports = {"java.util.Date", "java.util.Random"};
        for(String imp : imports){
            ImportDeclaration importDeclaration = ast.newImportDeclaration();
            importDeclaration.setName(ast.newName(imp));
            compilationUnit.imports().add(importDeclaration);
        }

        
        //创建一个main方法
        {
            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);
            
            //创建Pragram对象: Program program=new Program();
            VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment();
            fragment.setName(ast.newSimpleName("program"));
            VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment);
            statement.setType(ast.newSimpleType(ast.newSimpleName("Program")));
            
            ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();
            classInstanceCreation.setType(ast.newSimpleType(ast.newSimpleName("Program")));
            
            fragment.setInitializer(classInstanceCreation);
            
            mainBlock.statements().add(statement);
            
            //调用getString方法:String r = program.getString("中国");
            MethodInvocation methodInvocation = ast.newMethodInvocation();
            methodInvocation.setExpression(ast.newSimpleName("program"));
            methodInvocation.setName(ast.newSimpleName("getString"));
            
            //String参数
            StringLiteral stringLiteral = ast.newStringLiteral();
            stringLiteral.setLiteralValue("中国");
            methodInvocation.arguments().add(stringLiteral);
            
            //创建变量
            VariableDeclarationFragment fragment2 = ast.newVariableDeclarationFragment();
            fragment2.setName(ast.newSimpleName("r"));
            VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2);
            statement3.setType(ast.newSimpleType(ast.newSimpleName("String")));
            fragment2.setInitializer(methodInvocation);
            
            mainBlock.statements().add(statement3);
            
            
            //输出r的值: System.out.println(r);
            MethodInvocation methodInvocation2 = ast.newMethodInvocation();
            methodInvocation2.setExpression(ast.newName("System.out"));
            methodInvocation2.setName(ast.newSimpleName("println"));
            methodInvocation2.arguments().add(ast.newSimpleName("r"));
            ExpressionStatement statement2 = ast.newExpressionStatement(methodInvocation2);
            
            mainBlock.statements().add(statement2);
        }

        
        //构造方法
        {
            MethodDeclaration constructorMethod = ast.newMethodDeclaration();
            constructorMethod.setConstructor(true);
            constructorMethod.setName(ast.newSimpleName("Program"));
            constructorMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
            {
                //基本类型的参数
                SingleVariableDeclaration p1 = ast.newSingleVariableDeclaration();
                p1.setName(ast.newSimpleName("a"));
                p1.setType(ast.newPrimitiveType(PrimitiveType.INT));
                
                //int[]类型的参数
                SingleVariableDeclaration p2 = ast.newSingleVariableDeclaration();
                p2.setName(ast.newSimpleName("b"));
                p2.setType(ast.newArrayType(ast.newPrimitiveType(PrimitiveType.INT)));
                
                //引用类型的参数
                SingleVariableDeclaration p3 = ast.newSingleVariableDeclaration();
                p3.setName(ast.newSimpleName("c"));
                p3.setType(ast.newSimpleType(ast.newName("Integer")));
                p3.modifiers().add(ast.newModifier(ModifierKeyword.FINAL_KEYWORD));
                
                constructorMethod.parameters().add(p1);
                constructorMethod.parameters().add(p2);
                constructorMethod.parameters().add(p3);
            }

            
            Block constructBlock = ast.newBlock();
            constructorMethod.setBody(constructBlock);
            
            programClass.bodyDeclarations().add(constructorMethod);
            
            SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation();
            constructBlock.statements().add(superConstructorInvocation);
            superConstructorInvocation.arguments().add(ast.newNullLiteral());
        }

        
        /*定义一个方法,形如:
        public String getString(String name){
            String newString = name + "你好";
            return newString;
        }
        
*/

        
        {
            MethodDeclaration getString = ast.newMethodDeclaration();
            getString.setName(ast.newSimpleName("getString"));
            getString.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
            SingleVariableDeclaration p = ast.newSingleVariableDeclaration();
            p.setName(ast.newSimpleName("p"));
            p.setType(ast.newSimpleType(ast.newName("String")));
            getString.parameters().add(p);
            getString.setReturnType2(ast.newSimpleType(ast.newSimpleName("String")));
            
            
            //创建块
            Block block = ast.newBlock();
            getString.setBody(block);
            programClass.bodyDeclarations().add(getString);
            
            //方法内容----定义String变量
            VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment();
            fragment.setName(ast.newSimpleName("newString"));
            VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment);
            
            //String newString = "初始值";
            /*StringLiteral stringLiteral2 = ast.newStringLiteral();
            stringLiteral2.setLiteralValue("初始值");
            fragment.setInitializer(stringLiteral2);
*/

            
            ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();
            classInstanceCreation.setType(ast.newSimpleType(ast.newName("String")));
            SingleVariableDeclaration p1 = ast.newSingleVariableDeclaration();
            StringLiteral stringLiteral3 = ast.newStringLiteral();
            stringLiteral3.setLiteralValue("初始值");
            classInstanceCreation.arguments().add(stringLiteral3);
            fragment.setInitializer(classInstanceCreation);
            
            statement.setType(ast.newSimpleType(ast.newName("String")));
            
            Assignment assignment = ast.newAssignment();
            assignment.setLeftHandSide(ast.newSimpleName("newString"));
            StringLiteral stringLiteral = ast.newStringLiteral();
            stringLiteral.setLiteralValue("你好");
            
            assignment.setRightHandSide(stringLiteral);
            assignment.setOperator(Operator.ASSIGN);
            ExpressionStatement statement2 = ast.newExpressionStatement(assignment);
            
            block.statements().add(statement);
            block.statements().add(statement2);
            
            //方法调用
            MethodInvocation methodInvocation = ast.newMethodInvocation();
            methodInvocation.setExpression(ast.newName("newString"));
            methodInvocation.setName(ast.newSimpleName("index")); //方法名
            StringLiteral stringLiteral2 = ast.newStringLiteral();
            stringLiteral2.setLiteralValue("值");
            methodInvocation.arguments().add(stringLiteral2);
            
            VariableDeclarationFragment fragment2 = ast.newVariableDeclarationFragment();
            fragment2.setInitializer(methodInvocation);
            fragment2.setName(ast.newSimpleName("result"));
            VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2);
            statement3.setType(ast.newSimpleType(ast.newName("String")));
            
            block.statements().add(statement3);
            
            StringLiteral stringLiteral4 = ast.newStringLiteral();
            stringLiteral4.setLiteralValue("你好");
            
            InfixExpression infixExpression = ast.newInfixExpression();
            infixExpression.setLeftOperand(ast.newName("name"));
            infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.PLUS);
            infixExpression.setRightOperand(stringLiteral4);
            
            Assignment assignment2 = ast.newAssignment();
            assignment2.setLeftHandSide(ast.newSimpleName("newString"));
            assignment2.setOperator(Operator.ASSIGN);
            assignment2.setRightHandSide(infixExpression);
            
            ExpressionStatement statement4 = ast.newExpressionStatement(assignment2);
            
            block.statements().add(statement4);

            ReturnStatement rs = ast.newReturnStatement();
            rs.setExpression(ast.newName("newString"));
            block.statements().add(rs);
        }

        
        /**
         * 定义一个方法,形如:
         * public String isOdd(int a) throws NullPointerException, Exception{
         *     if(a < 0) throw new Exception("数字不能为负数");
         * 
         *     if(a % 2 == 0){
         *         return "偶数";
         *     }else{
         *         System.out.println("完");
         *         return "奇数";
         *     }
         
*/

        {
            MethodDeclaration methodDeclaration = ast.newMethodDeclaration();
            methodDeclaration.setName(ast.newSimpleName("isOdd"));
            methodDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
            methodDeclaration.setReturnType2(ast.newSimpleType(ast.newSimpleName("String")));
            //设置参数
            SingleVariableDeclaration singleVariableDeclaration = ast.newSingleVariableDeclaration();
            singleVariableDeclaration.setName(ast.newSimpleName("a"));
            singleVariableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
            methodDeclaration.parameters().add(singleVariableDeclaration);

            //抛出异常
            methodDeclaration.thrownExceptions().add(ast.newSimpleName("NullPointerException"));
            methodDeclaration.thrownExceptions().add(ast.newSimpleName("Exception"));
            
            //创建块{}
            Block isOddBlock = ast.newBlock();
            methodDeclaration.setBody(isOddBlock);
            
            //创建if与异常
            IfStatement ifStatement = ast.newIfStatement();
            //表达式 a < 0
            InfixExpression infixExpression = ast.newInfixExpression();
            infixExpression.setLeftOperand(ast.newSimpleName("a"));
            infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.LESS);
            
            NumberLiteral numberLiteral = ast.newNumberLiteral("0");
            infixExpression.setRightOperand(numberLiteral);
            
            ifStatement.setExpression(infixExpression);
            
            //设置if中的内容
            ThrowStatement throwStatement = ast.newThrowStatement();
            ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();
            classInstanceCreation.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
            StringLiteral stringLiteral = ast.newStringLiteral();
            stringLiteral.setLiteralValue("数字不能为负数");
            classInstanceCreation.arguments().add(stringLiteral);
            throwStatement.setExpression(classInstanceCreation);
            ifStatement.setThenStatement(throwStatement);
            
            //if(a % 2 == 0)
            IfStatement ifStatement2 = ast.newIfStatement();
            InfixExpression infixExpression2 = ast.newInfixExpression();
            infixExpression2.setLeftOperand(ast.newSimpleName("a"));
            infixExpression2.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.REMAINDER);
            NumberLiteral numberLiteral2 = ast.newNumberLiteral("2");
            infixExpression2.setRightOperand(numberLiteral2);
            
            InfixExpression infixExpression3 = ast.newInfixExpression();
            infixExpression3.setLeftOperand(infixExpression2);
            infixExpression3.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.EQUALS);
            NumberLiteral numberLiteral3 = ast.newNumberLiteral("0");
            infixExpression3.setRightOperand(numberLiteral3);
            
            ifStatement2.setExpression(infixExpression3);
            
            //return "偶数";
            ReturnStatement returnStatement = ast.newReturnStatement();
            StringLiteral stringLiteral2 = ast.newStringLiteral();
            stringLiteral2.setLiteralValue("偶数");
            returnStatement.setExpression(stringLiteral2);
            ifStatement2.setThenStatement(returnStatement);
            
            //else
            Block elseBlock = ast.newBlock();
            MethodInvocation methodInvocation = ast.newMethodInvocation();
            methodInvocation.setExpression(ast.newName("System.out"));
            methodInvocation.setName(ast.newSimpleName("println"));
            StringLiteral stringLiteral4 = ast.newStringLiteral();
            stringLiteral4.setLiteralValue("完");
            methodInvocation.arguments().add(stringLiteral4);
            ExpressionStatement statement = ast.newExpressionStatement(methodInvocation);
            elseBlock.statements().add(statement);
            
            ReturnStatement returnStatement2 = ast.newReturnStatement();
            StringLiteral stringLiteral3 = ast.newStringLiteral();
            stringLiteral3.setLiteralValue("奇数");
            returnStatement2.setExpression(stringLiteral3);
            elseBlock.statements().add(returnStatement2);
            
            ifStatement2.setElseStatement(elseBlock);
            
            isOddBlock.statements().add(ifStatement);
            isOddBlock.statements().add(ifStatement2);
            programClass.bodyDeclarations().add(methodDeclaration);
        }

        
        System.out.println(compilationUnit.toString());
        
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值