Java调用Eclipse的编译器JDT

本文介绍如何利用Java、Ant、JDT等技术在Eclipse环境下实现Java和GWT混合项目的Nightly Build流程。重点包括抽取JDT编译器、配置Ant任务及调用Javac进行编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想给项目做一个Nightly build,项目特点如下:

  1 使用 Eclipse开发的java和GWT混合项目

  2 目前有40多个工程

  3 项目处于初期,很多部分尚未稳定,因此是工程是工程间依赖工程,没有引用编译好的jar包

  4 工程主要分为前台clt,公共模块common,和服务器模块svr。例如有一个A.common,一定有A.clt和A.svr依赖于A.common,但clt和svr间不相互依赖。

  (这是我们项目的编译过程的特殊逻辑)

  以下是选定的技术路线

  因为编译带有特殊的逻辑,所以使用方便编程的java,而非纯ant脚本。

  不想自己整理工程的编译顺序,太多,麻烦。所以使用了dom4j读取eclipse工程配置信息。

  不用ant脚本,可以使用Java程序调用Ant API。

  由于javac对模板的不友好 ,所以使用jdt

  例如以下的代码

  <!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->package demo.server;

  import com.extjs.gxt.ui.client.data.BaseModel;

  public class TestA extends BaseModel {

  @Override

  public < X > X get(String property) {

  return super .get(property);

  }

  }

  使用javac编译,就会出现

  无法确定 <X>X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例

  虽然搜索了以下,说只要返回值强制转换一下就ok,即return (X)super .get(property);

  但这样的代码也比较多,明明在eclipse编译通过的,在javac就不行。所以g了一下,才知道 eclipse有自己的编译器(?不太确认javac和jdt的关系),叫jdt。

  首先要从Eclipse中,抽取出一个JDT的包。在Eclipse/plugin目录下,找到一个org.eclipse.jdt.core _3.5.1.v_972_R35x.jar,(版本社么的没有关系)。用winrar解压出里面的一个jdtCompilerAdapter.jar包,然后从工程中引用它。

  顺便把

  org.eclipse.jdt.compiler.tool_1.0.100.v_972_R35x.jar

  org.eclipse.jdt.core_3.5.2.v_981_R35x.jar

  org.eclipse.jdt.debug.ui_3.4.1.v20090811_r351.jar

  这几个包也从eclipse/plugin中引用到项目里。——为什么要单独解压jdtCompilerAdapter.jar,我不太清楚啊。

  然后,由于要调用ant,所以从apache上的ant项目中下载http://ant.apache.org/bindownload.cgi,用到两个包,

  ant.jar

  ant-launcher.jar

  使用以下代码,调用ant

  <!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->package thss.platform.util.mrobuild;

  import java.io.File;

  import org.apache.tools.ant.Project;

  import org.apache.tools.ant.taskdefs.Javac;

  import org.apache.tools.ant.taskdefs.Javac.ImplementationSpecificArgument;

  import org.apache.tools.ant.types.Path;

  public class JavaBuilder {

  public JavaBuilder() {

  }

  public void execute(Path classPath, File output) {

  Project currentProject = new Project();

  // 填写工程的绝对目录,这样后面可以使用相对目录

  currentProject.setBaseDir( new File( " 这里是工程的绝对目录 " ));

  Javac compileJava = new Javac();

  compileJava.setProject(currentProject);

  // 调用jdt编译器

  compileJava.setCompiler( " org.eclipse.jdt.core.JDTCompilerAdapter " );

  compileJava.setClasspath(classPath);

  compileJava.setEncoding( " UTF-8 " );

  // 填写相对目录src

  compileJava.setSrcdir( new Path(currentProject, " src " ));

  // 编译后的结果.class输出到哪里

  compileJava.setDestdir(output);

  compileJava.setTarget( " 1.6 " );

  compileJava.setSource( " 1.6 " );

  compileJava.setNowarn( true );

  compileJava.setDebug( true );

  compileJava.setDebugLevel( " lines,source " );

  // javac需要这段,换成了jdt不知道要不要了

  ImplementationSpecificArgument arg = compileJava.createCompilerArg();

  arg.setLine( " -Xlint " );

  compileJava.execute();

  }

  }

  可能上述文章有很多概念性的问题,例如我没有搞清的javac和jdt关系,但是问题确实是解决了

首先了解一下flexBuilder FlexBuilder 2.0 是建立在 eclipse 3.1基础上的 FlexBuilder 3.2.1 是建立在eclipse 3.2.1基础上的 所以要想支持vss 首先要准备eclipse 3.1 或者 eclipse3.2.1 就看你用什么版本的flexbuilder FlexBuilder 3使用 vss1.6.1; FlashBuilder 4使用 vss 1.6.2; 1. 下下载一个vss插件 最新版本是1.6.2 下载地址:http://sourceforge.net/projects/vssplugin/ (或者http://download.youkuaiyun.com/detail/ch_kexin/4925652) 放入 flexbuilder 目录的plugin 目录下 打开flexbuilder 很多人都会发现不能用 当然这也是让很多人忘而却步的地方 2. 为什么不能用? 原因是flexbuilder中 精简了eclipse 中的一些组建 ,vss插件又需要,怎么办? 刚准备的eclipse 就发挥了用处 下载一个eclipse (请下载对应的版本) 然后解开 将eclipse 的plugin 目录下的 org.eclipse.jdt.* 的目录和文件 全部拷贝到 flexbuilder 的plugin (若为myEclipse则是将myEclipseeclipse\plugins) flashbuilder也一样 ----下面是在FlexBuilder中配置VSS ------- 1. 首先绑定项目到VSS。就算打开的项目是从VSS里获取的,第一次打开也需要手动绑定。选中图中最后一个菜单中的选项:Share Project进入新界面后,选中VSS Configuration Wizard进入如下界面。 2. 填上客户端用户名、密码、服务器端VSS目录、项目目录、项目在VSS里的目录。 VSS Repository supports multiple checkouts.不选,此项是VSS支持多人同时签出。根据实际情况决定是否选中。 3.单击Finish。配置VSS完毕。 4.配置完毕。 VSS配置完成后。项目并未与VSS有任何关联,此时需要 Update State来关联到VSS。
解决Eclipse中使用drool时报Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath的问题。 详细错误: org.drools.RuntimeDroolsException: Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:java:org.drools.rule.builder.dialect.java.JavaDialectConfiguration' at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:283) at org.drools.compiler.PackageBuilderConfiguration.buildDialectConfigurationMap(PackageBuilderConfiguration.java:268) at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:181) at org.drools.compiler.PackageBuilderConfiguration.(PackageBuilderConfiguration.java:159) at org.drools.compiler.PackageBuilder.(PackageBuilder.java:210) at org.drools.compiler.PackageBuilder.(PackageBuilder.java:143) at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFactoryServiceImpl.java:34) at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:47) at main.com.flashsky.server.core.aml.rules.Test.testDrool(Test.java:18) at test.com.flashsky.server.core.aml.rules.TestTest.testTestDrool(TestTest.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.setCompiler(JavaDialectConfiguration.java:94) at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.init(JavaDialectConfiguration.java:55) at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:279) ... 33 more
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()); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值