JET(Java Emitter Templates)项目是Eclipse下的一个子项目,用于代码生成的工作。下面演示下如何应用Jet生成自己需要的代码:
以下的例子在eclipse3.4上运行通过。在这个版本中还添加了一个jet文件的编辑器,有代码高亮显示的功能的。
一、创建JET Transformation Project 项目。
clip_p_w_picpath002
键入项目名,如“codeGen”
clip_p_w_picpath004
在随后生成的项目的文件目录结构如下:
使用JET做代码生成工具(生成Java和hibernate XML文件)_第1张图片
二、各文件用途说明
1.Jet 项目的主要思路是:
参数文件(sample.xml)+模板文件(xxx.jet)文件=生成文件(.java,.xml等文件)
2. 在用JET 项目生成代码的过程中主要涉及下面3 个文件:
sample.xml文件,这个xml文件主要提供输入数据
main.jet这个是入口文件,相当于Java,C++等编程语言中的main函数,调用其他的jet文件
xxx.jet文件:这个文件是具体的模板文件,可以针对不同的代码生成功能制作不同的jet文件。
第一步:在templates 文件夹下创建新的模板文件:car.jet 内容如下:
class < c:get select="$p/@name" /> {
< c:iterate select="$p/property" var="per" >
private < c:get select="$per/@type" /> < c:get select="$per/@name" />;
c:iterate>
public < c:get select="$p/@name" />() {
< c:iterate select="$p/property" var="per" >
this.< c:get select="$p/@name" /> = < c:choose select="$p/@type" >
< c:when test="'String'">"< c:get select="$p/@initial" />"c:when>
< c:otherwise>< c:get select="$per/@initial" />c:otherwise>
c:choose>
;
c:iterate>
}
< c:iterate select="$p/property" var="per" >
public void set< c:get select="camelCase($per/@name)" />(< c:get select="$per/@type" />
< c:get select="$per/@name" />) {
System.out.println("In set< c:get select="camelCase($per/@name)" />()");
this.< c:get select="$per/@name" /> = < c:get select="$per/@name" />;
}
public < c:get select="$per/@type" /> get< c:get select="camelCase($per/@name)" />() {
System.out.println("In get< c:get select="camelCase($per/@name)" />()");
return < c:get select="$per/@name" />;
}
c:iterate>
}
第二步:在main.jet 模板文件中追加如下代码:
< c:iterate select="/app/class" var="p" >
< ws:file template="templates/car.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.java" />
c:iterate>
第三步:修改 sample.xml 文件为如下内容:
项目文件目录结构:
使用JET做代码生成工具(生成Java和hibernate XML文件)_第2张图片
第四步:项目运行配置,设置如下
clip_p_w_picpath010
第五步:将产生如下的car.java 文件:
class Car {
private String model;
private int horsepower;
private boolean spareTires;
public Car() {
this.Car = Honda Accord;
this.Car = 140;
this.Car = true;
}
public void setModel(String model) {
System. out.println("In setModel()");
this.model = model;
}
public String getModel() {
System. out.println("In getModel()");
return model;
}
public void setHorsepower( int horsepower) {
System. out.println("In setHorsepower()");
this.horsepower = horsepower;
}
public int getHorsepower() {
System. out.println("In getHorsepower()");
return horsepower;
}
public void setSparetires( boolean spareTires) {
System. out.println("In setSparetires()");
this.spareTires = spareTires;
}
public boolean getSparetires() {
System. out.println("In getSparetires()");
return spareTires;
}
}
三、再做一个产生 hibernate hbm.xml 配置文件的例子。
第一步:同上一个例子,在 templates 文件夹下创建一个 hbm.xml.jet (这个文件名是任意的,只要扩展名是 jet 就可以)的模板文件
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
" table="< c:get select="$p/@name" />">
SEQ_TAB_CASH_EXPENSE_ACT_ID
< c:iterate select="$p/property" var="per" >
" type="< c:get select="$per/@type" />">
" precision="1" not-null="true" />
c:iterate>
第二步:在 main.jet 中追加如下代码
< c:iterate select="/app/class" var="p" >
< ws:file template="templates/hbm.xml.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.hbm.xml" />
c:iterate>
第三步:运行会产生如下文件“ Car.hbm.xml
xml version="1.0"?>
hibernate-mapping PUBLIC "-// Hibernate/ Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
SEQ_TAB_CASH_EXPENSE_ACT_ID
最后文件目录如下:
使用JET做代码生成工具(生成Java和hibernate XML文件)_第3张图片
四:把其他项目转换成JET项目。
第一步:新建一个普通的Java Project,项目名为:“CodeGen2”,然后按如下方式转换成JET项目。
clip_p_w_picpath014
在下一步中选择“CodeGen2”项目,如下图:
使用JET做代码生成工具(生成Java和hibernate XML文件)_第4张图片
最后项目目录下多了一个templates文件夹:
clip_p_w_picpath018
修改项目的properties如下:
使用JET做代码生成工具(生成Java和hibernate XML文件)_第5张图片
把上个项目的car.jet文件拷贝到templates文件夹下。
并在该文件的最顶部添加如下代码:
<%@ jet package="cn.edu.pku.pafirc" class="CarTemplate" %>
就会生成如下的文件:CarTemplate.java文件
package cn.edu.pku.pafirc;
public class CarTemplate {
protected static String nl;
public static synchronized CarTemplate create(String lineSeparator) {
nl = lineSeparator;
CarTemplate result = new CarTemplate();
nl = null;
return result;
}
public final String NL = nl == null ? (System. getProperties()
.getProperty("line.separator")) : nl;
protected final String TEXT_1 = "class {"
+ NL
+ ""
+ NL
+ "\tprivate ;"
+ NL
+ ""
+ NL
+ ""
+ NL
+ ""
+ NL
+ "\tpublic () {"
+ NL
+ "\t"
+ NL
+ "\t\tthis. = "
+ NL
+ "\t\t\"\""
+ NL
+ "\t\t"
+ NL
+ "\t\t"
+ NL
+ ";"
+ NL
+ "\t"
+ NL
+ "\t}"
+ NL
+ ""
+ NL
+ ""
+ NL
+ "\tpublic void set("
+ NL
+ "\t) {"
+ NL
+ "\t\tSystem.out.println(\"In set()\");"
+ NL
+ "\t\tthis. = ;"
+ NL
+ "\t}"
+ NL
+ "\t"
+ NL
+ "\tpublic get() {"
+ NL
+ "\t\tSystem.out.println(\"In get()\");"
+ NL + "\t\treturn ;" + NL + "\t}"
+ NL + "\t" + NL + "" + NL + "" + NL + "" + NL + ""
+ NL + "}";
public String generate(Object argument) {
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
return stringBuffer.toString();
}
}
获取sampl.xml文件的内容,作为参数传入generate(Object argument)就是产生需要的最终Java文件。