JDT操作AST重构if块

实现效果1:

 

实现效果2:

代码:

类1:

package astTest;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;

import refactoring.test.test004;

public class MainDo {

	public MainDo(String path) throws FileNotFoundException, IOException {
		CompilationUnit comp = getCompilationUnit(path);

		// DemoVisitor visitor = new DemoVisitor();
		// comp.accept(visitor);
		IfTransformer IfTransformer = new IfTransformer();
		comp.accept(IfTransformer);
		InstanceOfRefactor instanceOfRefactor = new InstanceOfRefactor();
		comp.accept(instanceOfRefactor);	
		
		test004.saveFile(comp.toString(), path);
	}

	public static void main(String[] args) throws FileNotFoundException, IOException {
		System.out.println("begin");
		MainDo DemoVisitorTest = new MainDo(
				"D:\\refactoringTest\\src\\astTest\\ChangeDemo01.java");
		MainDo DemoVisitorTest2 = new MainDo(
				"D:\\refactoringTest\\src\\astTest\\ChangeDemo02.java");

		System.out.println("end");
	}
	/**
	 * get compilation unit of source code
	 * 
	 * @param javaFilePath
	 * @return CompilationUnit
	 */
	public static CompilationUnit getCompilationUnit(String javaFilePath) {
		byte[] input = null;
		try {
			BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(javaFilePath));
			input = new byte[bufferedInputStream.available()];
			bufferedInputStream.read(input);
			bufferedInputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		ASTParser astParser = ASTParser.newParser(AST.JLS8);
		astParser.setSource(new String(input).toCharArray());
		astParser.setKind(ASTParser.K_COMPILATION_UNIT);

		CompilationUnit result = (CompilationUnit) (astParser.createAST(null));

		return result;
	}

}

类2:

package astTest;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.InfixExpression.Operator;


import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.StringLiteral;
 
public class IfTransformer extends ASTVisitor {

	List<ASTNode> functionPartUpper=new ArrayList<>();
	List<ASTNode> upper=new ArrayList<>();
	List<ASTNode> center=new ArrayList<>();
	List<ASTNode> tail=new ArrayList<>();
	List<ASTNode> functionPartTail=new ArrayList<>();

	Expression  childExression=null;
	Expression  parentExression=null;

	@Override
	public boolean visit(IfStatement node) {
		{
			Statement then=node.getThenStatement();
			Block block=(Block)then;
			List<Statement> child=block.statements();
			System.out.println(child);
			boolean isTail=false;
			//提取if内的内容,按照前中后组合
			isTail = getStatementsToList(node, child, isTail);
			//判断是否符合重构条件
			if (childExression==null) {
				return false;
			}
			
			//[modify by changxiaosong for 保存父类的上下部分的内容,防止被覆盖 at 2021年11月24日 begin
			Block funcBlock = saveIfUpperAndTail(node,functionPartUpper,functionPartTail);

			//modify   by changxiaosong  at 2021年11月24日 end]
			
			
			//拼接代码块,放入if中
			//上面if
			IfStatement blockNewIfUpper = gatherUpperIf(node);
			/*
			Block blockNew = node.getAST().newBlock();
			blockNew.statements().add((Statement)ASTNode.copySubtree(node.getAST(),  upper.get(0)));
			node.setThenStatement(blockNew);*/
			//中间if
			IfStatement blockNewIfCenter = gatherCenterIf(node);
			
			//下面if
			IfStatement blockNewIfLow = gatherTailIf(node);
			//拼接上中下
			
			gatherAllNewStatements(node, funcBlock, blockNewIfUpper, blockNewIfCenter, blockNewIfLow);
			childExression=null;
		}
 
		return false;
	}

	public IfStatement gatherTailIf(IfStatement node) {
		IfStatement blockNewIfLow = node.getAST().newIfStatement();
		blockNewIfLow.setExpression((Expression)copyBlock(node,parentExression));
		Block blockTail= arrayToBlock(node,tail);
		blockNewIfLow.setThenStatement(blockTail);
		return blockNewIfLow;
	}

	public IfStatement gatherCenterIf(IfStatement node) {
		IfStatement blockNewIfCenter = node.getAST().newIfStatement();
		//拼接条件
		InfixExpression expression = node.getAST().newInfixExpression();
		expression.setLeftOperand((Expression)ASTNode.copySubtree(node.getAST(),  node.getExpression()));
		expression.setOperator(Operator.CONDITIONAL_AND);
		expression.setRightOperand((Expression)copyBlock(node,childExression));
		blockNewIfCenter.setExpression((Expression)copyBlock(node,expression));
		Block blockNewCenter = arrayToBlock(node,center);
		blockNewIfCenter.setThenStatement(blockNewCenter);
		return blockNewIfCenter;
	}

	public IfStatement gatherUpperIf(IfStatement node) {
		IfStatement blockNewIfUpper = node.getAST().newIfStatement();
		blockNewIfUpper.setExpression((Expression)ASTNode.copySubtree(node.getAST(),  parentExression));
		Block blockNewUpper = arrayToBlock(node,upper);
		blockNewIfUpper.setThenStatement(blockNewUpper);
		return blockNewIfUpper;
	}

	public void gatherAllNewStatements(IfStatement node, Block funcBlock, IfStatement blockNewIfUpper,
			IfStatement blockNewIfCenter, IfStatement blockNewIfLow) {
		funcBlock.statements().clear();
		//原来的头
		arrayAddToStatements(node,functionPartUpper,funcBlock.statements());
		//拆分的三个if条件
		funcBlock.statements().add(blockNewIfUpper);
		funcBlock.statements().add(blockNewIfCenter);
		funcBlock.statements().add(blockNewIfLow);
		//原来的尾巴 
		arrayAddToStatements(node,functionPartTail,funcBlock.statements());
	}

	public boolean getStatementsToList(IfStatement node, List<Statement> child, boolean isTail) {
		for (Statement object : child) {
			if (object instanceof IfStatement) {
				IfStatement childIf=(IfStatement)object;
				Statement childIfStatement=childIf.getThenStatement();
				parentExression=node.getExpression();
				childExression=childIf.getExpression();
				center.add(childIfStatement);
				isTail=true;
			}else {
				if (isTail) {
					tail.add(object);
				}else {
					upper.add(object);
				}
			}
		}
		return isTail;
	}

	public Block saveIfUpperAndTail(IfStatement node,List<ASTNode> functionPartUpper,List<ASTNode> functionPartTail) {
		return Tool.saveIfUpperAndTail(node, functionPartUpper, functionPartTail);
	}

	public ASTNode copyBlock(IfStatement node,Expression childExression) {
		return Tool.copyBlock(node, childExression);
	}

	public ASTNode copyBlock(IfStatement node, Statement sentenceOne) {
		return Tool.copyBlock(node, childExression);
	}

	public Block arrayToBlock(IfStatement node,List<ASTNode> upper) {
		Block blockNewUpper = node.getAST().newBlock();
		for (ASTNode nodeTmp : upper) {
			blockNewUpper.statements().add((Statement)ASTNode.copySubtree(node.getAST(),  nodeTmp));
		}
		return blockNewUpper;
	}
	public void arrayAddToStatements(IfStatement node,List<ASTNode> upper,List  statements) {
		Tool.arrayAddToStatements(node, upper, statements);
	}
	public boolean visitOrg(IfStatement node) {
		/**
		 * fragment != null
		 */
		InfixExpression ie = (InfixExpression)node.getExpression();
		ie.setOperator(Operator.NOT_EQUALS);
		{
			Statement then=node.getThenStatement();
			Block block=(Block)then;
			List child=block.statements();
			
			
		}
		
		/**
		 * if (fragment == null) {
		 *	  System.out.println("Wrong!");
		 * }
		 * else {
		 *    System.out.println("Wrong!");
		 * }
		 */
		node.setElseStatement(
				(Block) ASTNode.copySubtree(node.getAST(),  node.getThenStatement()));
 
		/**
		 * if (fragment == null) {
		 *	  System.out.println("Done!");
		 * }
		 * else {
		 *    System.out.println("Wrong!");
		 * }
		 */
		AST ast = node.getAST();
		
		MethodInvocation methodInv = ast.newMethodInvocation();
 
		SimpleName nameSystem = ast.newSimpleName("System");
		SimpleName nameOut = ast.newSimpleName("out");
		SimpleName namePrintln = ast.newSimpleName("println");
 
		//连接‘System’和‘out’
		//System.out
		QualifiedName nameSystemOut = ast.newQualifiedName(nameSystem, nameOut);
 
		//连接‘System.out’和‘println’到MethodInvocation节点
		//System.out.println()
		methodInv.setExpression(nameSystemOut);
		methodInv.setName(namePrintln);
 
		//"Done!"
		StringLiteral sDone = ast.newStringLiteral();
		sDone.setEscapedValue("\"Done!\"");
 
		//System.out.println("Done!")
		methodInv.arguments().add(sDone);
 
		//将方法调用节点MethodInvocation连接为表达式语句ExpressionStatement的子节点
		//System.out.println("Done!");
		ExpressionStatement es = ast.newExpressionStatement(methodInv);
		
		//将表达式语句连接为新建语句块节点Block的子节点
		//{
		//System.out.println("Done!");
		//}
		Block block = ast.newBlock();
		block.statements().add(es);
		MethodInvocation methodInv2 = ast.newMethodInvocation();
		SimpleName nameSystem2 = ast.newSimpleName("System");
		SimpleName nameOut2 = ast.newSimpleName("out");
		SimpleName namePrintln2 = ast.newSimpleName("println");
		QualifiedName nameSystemOut2 = ast.newQualifiedName(nameSystem2, nameOut2);

		methodInv2.setExpression(nameSystemOut2);
		methodInv2.setName(namePrintln2);
		StringLiteral sDone2 = ast.newStringLiteral();
		sDone2.setEscapedValue("\"Done!\"");
		methodInv2.arguments().add(sDone2);
		ExpressionStatement es2 = ast.newExpressionStatement(methodInv2);

		block.statements().add(es2);
		
		//将语句块节点Block连接为IfStatement节点的子节点
		node.setThenStatement(block);
 
		return false;
	}
}

 类3:

package astTest;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.InstanceofExpression;
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.SimpleType;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeDeclaration;

public class InstanceOfRefactor extends ASTVisitor{
	List bodyDeclarations=null;
	@Override
	public boolean visit(IfStatement node) {
		// TODO Auto-generated method stub
		SimpleType childTpye=null;
		Expression child=null;
		Block ifBolck=null;
		Block elseBolck=null;
		//判断是否符合重构条件 if,else,instanceof 
		if (node.getExpression() instanceof InstanceofExpression
				&&!(node.getElseStatement() instanceof IfStatement)) {
			InstanceofExpression  expression= (InstanceofExpression) node.getExpression();
			//提取条件中的对象,获取父类
			child=expression.getLeftOperand();
			childTpye=(SimpleType) expression.getRightOperand();
			//提取if体
			ifBolck=(Block)(node.getThenStatement());
			//提取else体
			elseBolck=(Block)(node.getElseStatement());
			
			
		}else {
			return false;
		}
		AST ast=node.getAST();
		//构建if方法块
		buildIfBlock(node, childTpye, child, ifBolck);
		//构建else方法块
		buildElseBlock(node, childTpye, child, elseBolck);
		//保存if块前后的内容
		List<ASTNode> functionPartUpper=new ArrayList<>();
		List<ASTNode> functionPartTail=new ArrayList<>();

		Tool.saveIfUpperAndTail(node, functionPartUpper, functionPartTail);
		//构建if上级内的其他内容
		changeMethordUsed(node, ast, functionPartUpper, functionPartTail);
		
		return false;
	}
	public void changeMethordUsed(IfStatement node, AST ast, List<ASTNode> functionPartUpper,
			List<ASTNode> functionPartTail) {
		//原来的头
		Block funcBlock=((Block)node.getParent());
		funcBlock.statements().clear();
		Tool.arrayAddToStatements(node,functionPartUpper,funcBlock.statements());
		MethodInvocation newMethord=ast.newMethodInvocation();
		newMethord.setName(ast.newSimpleName("fun01"));

	    newMethord.arguments().add(ast.newSimpleName("customer"));
		
		ExpressionStatement es2 = ast.newExpressionStatement(newMethord);
		funcBlock.statements().add(es2);

		//原来的尾
		Tool.arrayAddToStatements(node,functionPartTail,funcBlock.statements());
		//保存文件
	}
	public void buildIfBlock(IfStatement node, SimpleType childTpye, Expression child, Block ifBolck) {
		ASTNode astNode=node.getParent().getParent().getParent();
		AST ast=node.getParent().getParent().getParent().getAST();

		MethodDeclaration ifFun= astNode.getAST().newMethodDeclaration();
		ifFun.setName(astNode.getAST().newSimpleName("fun01"));
		ifFun.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PRIVATE_KEYWORD));
		SingleVariableDeclaration param=ast.newSingleVariableDeclaration();
		param.setType((Type) Tool.copyBlock(node, childTpye));
		param.setName(astNode.getAST().newSimpleName(child.toString()));
		ifFun.parameters().add(param);
		ifFun.setBody((Block)Tool.copyBlock(node, ifBolck));

		bodyDeclarations.add(ifFun);
	}
	public void buildElseBlock(IfStatement node, SimpleType childTpye, Expression child, Block elseBolck) {
		ASTNode astNode=node.getParent().getParent().getParent();
		AST ast=node.getParent().getParent().getParent().getAST();

		MethodDeclaration ifFun= astNode.getAST().newMethodDeclaration();
		ifFun.setName(astNode.getAST().newSimpleName("fun01"));
		ifFun.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PRIVATE_KEYWORD));
		SingleVariableDeclaration param=ast.newSingleVariableDeclaration();
		param.setType(astNode.getAST().newSimpleType(ast.newSimpleName( "User" )));
		param.setName(astNode.getAST().newSimpleName(child.toString()));
		ifFun.parameters().add(param);
		ifFun.setBody((Block)Tool.copyBlock(node, elseBolck));

		bodyDeclarations.add(ifFun);
	}
	  @Override
	    public boolean visit(TypeDeclaration node) {
		  bodyDeclarations= node.bodyDeclarations();
	        System.out.println("Class:\t" + node.getName());
	        return true;
	    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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(); //设置参数名称为arg mainParameter.setName(ast.newSimpleName("arg")); //设置参数类型为String[] mainParameter.setType(ast.newArrayType(ast.newSimpleType(ast.newName("String")))); main.parameters().add(mainParameter); //创建Pragram对象: Program program=new Program(); //创建一个变量声名明(变量的前半部份) VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment(); //(1)设置变量名称 fragment.setName(ast.newSimpleName("program")); //(2)为变量创建表AST节点类型 VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment); //(3)对变量进行修鉓符设置 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.set[removed]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")); //将声名创建为一个AST节点 VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2); //设置节点类型声名 statement3.setType(ast.newSimpleType(ast.newSimpleName("String"))); //调用methodInvocation方法,进行实例化 fragment2.setInitializer(methodInvocation); mainBlock.statements().add(statement3); //输出r的值: System.out.println(r); //(1)创建方法引用实例 MethodInvocation methodInvocation2 = ast.newMethodInvocation(); //(2)设置引用方法对像 methodInvocation2.set[removed]ast.newName("System.out")); //(3)设置方法名称 methodInvocation2.setName(ast.newSimpleName("println")); //设置方法参数 methodInvocation2.arguments().add(ast.newSimpleName("r")); //使用方法实例创建表达类型 ExpressionStatement statement2 = ast.newExpressionStatement(methodInvocation2); //将表达式添加到语句 mainBlock.statements().add(statement2); } //构造方法 { //创建一个方法声名(构造函数方法) MethodDeclaration constructorMethod = ast.newMethodDeclaration(); //(1)声名为构造方法 constructorMethod.setConstructor(true); //(2)设置方法名称为program constructorMethod.setName(ast.newSimpleName("Program")); //(3)设置方法的修鉓类型为公开 constructorMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD)); { //基本类型的参数 SingleVariableDeclaration p1 = ast.newSingleVariableDeclaration(); //(1)设置参数名称为a p1.setName(ast.newSimpleName("a")); //(2)设置参数类型为INT p1.setType(ast.newPrimitiveType(PrimitiveType.INT)); //int[]类型的参数 SingleVariableDeclaration p2 = ast.newSingleVariableDeclaration(); p2.setName(ast.newSimpleName("b")); p2.setType(ast.newArrayType(ast.newPrimitiveType(PrimitiveType.INT))); //引用类型的参数(创建一个修鉓类型为final的参数 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); //创建super SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation(); constructBlock.statements().add(superConstructorInvocation); superConstructorInvocation.arguments().add(ast.newNullLiteral()); } /**//*定义一个方法,形如: public String getString(String name){ String newString = name + "你好"; return newString; } */ { //创建getString()方法 MethodDeclaration getString = ast.newMethodDeclaration(); //(1)设置方法名称为getString getString.setName(ast.newSimpleName("getString")); //(2)设置方法public修饰 getString.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD)); //(3)设置方法参数 SingleVariableDeclaration p = ast.newSingleVariableDeclaration(); //(3.1)设置参数名称p p.setName(ast.newSimpleName("p")); //(3.2)设置参数类型String p.setType(ast.newSimpleType(ast.newName("String"))); //将参数添加到方法 getString.parameters().add(p); //设置return类型 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")); //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); //将classInstanceCreateion实初始化之后,作为变量实例 fragment.setInitializer(classInstanceCreation); //创建一个变量节点 VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment); //设置变量类型 statement.setType(ast.newSimpleType(ast.newName("String"))); //创建一个新作业 newString = "你好"; Assignment assignment = ast.newAssignment(); //设置左侧 assignment.setLeftHandSide(ast.newSimpleName("newString")); //(1)设置方法传入字面值 StringLiteral stringLiteral = ast.newStringLiteral(); stringLiteral.setLiteralValue("你好"); //(2)将字面值设置在右侧 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.set[removed]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")); //为变量声明一个Statement VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2); //定义类型 statement3.setType(ast.newSimpleType(ast.newName("String"))); //将Statement装入语句 block.statements().add(statement3); StringLiteral stringLiteral4 = ast.newStringLiteral(); stringLiteral4.setLiteralValue("你好"); //定义一个拼串对像name + "你好"; InfixExpression infixExpression = ast.newInfix[removed]); //(1)定义左侧 infixExpression.setLeftOperand(ast.newName("name")); //(2)设置连接符号 infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.PLUS); //(3)定义右侧 infixExpression.setRightOperand(stringLiteral4); //创建一个新作业 newString = name + "你好"; 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); //创建一个return Statement ReturnStatement rs = ast.newReturnStatement(); rs.set[removed]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.newInfix[removed]); infixExpression.setLeftOperand(ast.newSimpleName("a")); infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.LESS); NumberLiteral numberLiteral = ast.newNumberLiteral("0"); infixExpression.setRightOperand(numberLiteral); ifStatement.set[removed]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.set[removed]classInstanceCreation); ifStatement.setThenStatement(throwStatement); //if(a % 2 == 0) IfStatement ifStatement2 = ast.newIfStatement(); InfixExpression infixExpression2 = ast.newInfix[removed]); 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.newInfix[removed]); infixExpression3.setLeftOperand(infixExpression2); infixExpression3.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.EQUALS); NumberLiteral numberLiteral3 = ast.newNumberLiteral("0"); infixExpression3.setRightOperand(numberLiteral3); ifStatement2.set[removed]infixExpression3); //return "偶数"; ReturnStatement returnStatement = ast.newReturnStatement(); StringLiteral stringLiteral2 = ast.newStringLiteral(); stringLiteral2.setLiteralValue("偶数"); returnStatement.set[removed]stringLiteral2); ifStatement2.setThenStatement(returnStatement); //else Block elseBlock = ast.newBlock(); MethodInvocation methodInvocation = ast.newMethodInvocation(); methodInvocation.set[removed]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.set[removed]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()); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值