生成JAVA文件并在运行时使用它们

生成JAVA文件并在运行时使用它们,java,testing,code-generation,testng,Java,Testing,Code Generation,Testng,我正在尝试以下内容,由Cedric Beust在其他线程中提出 您可以将此作为预测试任务自己完成:实现代码生成器 以XML形式获取信息,获取相应的Java 并生成包含所有注释的TestNG源文件 放置在正确的位置。然后在该文件上运行TestNG 我对代码生成一无所知。有人能指引我正确的方向吗?一些简单的例子会很好 更新:这是我想要生成的模板 public class <tobeReadFromConfigFile> { @Test(groups="to be read from

我正在尝试以下内容,由Cedric Beust在其他线程中提出

您可以将此作为预测试任务自己完成:实现代码生成器 以XML形式获取信息,获取相应的Java 并生成包含所有注释的TestNG源文件 放置在正确的位置。然后在该文件上运行TestNG

我对代码生成一无所知。有人能指引我正确的方向吗?一些简单的例子会很好

更新:这是我想要生成的模板

public class <tobeReadFromConfigFile>
{
  @Test(groups="to be read from config file")
  public void <tobereadfromconfigfile>{
     //to be read from config file(Name of function to call)
     //to be read from config file(Name of function to call)
     //to be read from config file(Name of function to call)
  }
  .
  .
  .
}
公共类
{
@测试(groups=“从配置文件中读取”)
公共空间{
//从配置文件读取(要调用的函数名称)
//从配置文件读取(要调用的函数名称)
//从配置文件读取(要调用的函数名称)
}
.
.
.
}

函数中的代码将只是函数调用,必须从配置文件中准确读取和复制。FreeMarker模板如下所示:

public class ${className} {
    @Test(groups="${testGroups}")
    public void ${testMethodName}() {
        <#list methods as m>
        ${m}
        </#list>   
    }
}
public类${className}{
@测试(groups=“${testGroups}”)
public void${testMethodName}(){
${m}
}
}
它将从一个上下文中填充,基本上是一个hashmap,其中包含
className
testGroups
等条目,这些条目将从XML文件中读取<代码>方法将是一个
集合
(类似于列表),也可以从XML文件中读取

当然,还有许多其他模板库;这只是一个例子


FreeMarker模板的外观如下所示:

public class ${className} {
    @Test(groups="${testGroups}")
    public void ${testMethodName}() {
        <#list methods as m>
        ${m}
        </#list>   
    }
}
public类${className}{
@测试(groups=“${testGroups}”)
public void${testMethodName}(){
${m}
}
}
它将从一个上下文中填充,基本上是一个hashmap,其中包含
className
testGroups
等条目,这些条目将从XML文件中读取<代码>方法将是一个
集合
(类似于列表),也可以从XML文件中读取

当然,还有许多其他模板库;这只是一个例子



我编写了一个eclipse插件,该插件使用freemarker模板,并从org.eclipse.jdt.core中提供命名java类的上下文作为ICompilationUnit。您可以在

上查看它。我已经编写了一个eclipse插件,它使用freemarker模板,并从org.eclipse.jdt.core中提供命名java类的上下文ICompilationUnit。您可以在

查看什么示例,代码生成?使用任何模板引擎,如,并用Java代码和任何需要注入的动态内容填充它。@DaveNewton-是的,代码生成示例适合于上述原因。不知道您试图生成的内容会使提供更具体的帮助变得不可能。模板可以是任何内容,包括有效的Java源代码。例如,您可以在给定外部数据的情况下构建Java方法,比如从XML。除了“使用模板和数据构建合法Java代码”之外,您没有提供足够的信息来告诉您更多内容。@DaveNewton-添加了一个示例。出于篇幅的目的,移动到answer。只需查看FreeMarker文档,了解如何使用它、读取数据、构建上下文和评估模板。无论选择哪个库,您都将使用基本相同的步骤。什么示例,代码生成?使用任何模板引擎,如,并用Java代码和任何需要注入的动态内容填充它。@DaveNewton-是的,代码生成示例适合于上述原因。不知道您试图生成的内容会使提供更具体的帮助变得不可能。模板可以是任何内容,包括有效的Java源代码。例如,您可以在给定外部数据的情况下构建Java方法,比如从XML。除了“使用模板和数据构建合法Java代码”之外,您没有提供足够的信息来告诉您更多内容。@DaveNewton-添加了一个示例。出于篇幅的目的,移动到answer。只需查看FreeMarker文档,了解如何使用它、读取数据、构建上下文和评估模板。无论选择哪个库,您都将使用基本相同的步骤。配置文件可以是任何内容(XML、JSON或任何内容),对吗?然后我将使用Fremarker,它将读取配置文件并填充模板,对吗?@questions您是加载配置文件的人——它可以被uuencoded Swahili颠倒写,只要您可以从中提取所需的数据并将其转换为FreeMarker/等可以处理的内容。FreeMarker是一个模板引擎——您的代码消化配置信息并为模板设置上下文。如果您想直接从XML到Java而不需要代码,请使用XSL(ew)。您还可以使用Groovy/JRuby/etc解析XML并发出Java code.Grreat。。谢谢这看起来是一个好方法吗,我将在TestNG中使用上面生成的类?@questions您可以随意使用生成的代码——模板的输出是任意的,只要它满足您的需要,它可以是任何内容。配置文件可以是任何内容(XML或JSON或任何内容),对吗?然后我将使用Fremarker,它将读取配置文件并填充模板,对吗?@questions您是加载配置文件的人——它可以被uuencoded Swahili颠倒写,只要您可以从中提取所需的数据并将其转换为FreeMarker/等可以处理的内容。FreeMarker是一个模板引擎——您的代码消化配置信息并为模板设置上下文。如果您想直接从XML到Java而不需要代码,请使用XSL(ew)。您还可以使用Groovy/JRuby/etc解析XML并发出Java code.Grreat。。谢谢这看起来是一个好方法吗,我将在TestNG中使用上面生成的类?@questions您可以随意使用生成的代码--模板的输出是任意的,只要它能满足您的需要,