JET(Java Emitter Templates)项目是Eclipse下的一个子项目,用于代码生成的工作。下面演示下如何应用Jet生成自己需要的代码:
以下的例子在eclipse3.4上运行通过。在这个版本中还添加了一个jet文件的编辑器,有代码高亮显示的功能的。
一、创建JET Transformation Project
项目。
键入项目名,如“codeGen”
在随后生成的项目的文件目录结构如下:
二、各文件用途说明
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
文件为如下内容:
项目文件目录结构:
第四步:项目运行配置,设置如下
第五步:将产生如下的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">
SEQ_TAB_CASH_EXPENSE_ACT_ID
<
c:iterate select="$p/property" var="per" >
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 Project,项目名为:“CodeGen2”,然后按如下方式转换成JET项目。
在下一步中选择“CodeGen2”项目,如下图:
最后项目目录下多了一个templates文件夹:
修改项目的properties如下:
把上个项目的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文件。