%=s%>
基于Eclipse平台的代码生成技术(4)
时间:2012-02-26 IBM 吕锋 于沛 王轩
经 JET 编译后的模板文件代码内容如下,其中红色文字为利用骨架合并的效果。
清单 6. 模板文件代码
package demo.translated;
import java.util.Date;
import java.util.List;
public class Demo2 {
protected static String nl;
public static synchronized Demo1 create(String lineSeparator)
{
nl = lineSeparator;
Demo2 result = new Demo2();
nl = null;
return result;
}
public final String NL = nl == null ?
(System.getProperties().getProperty("line.separator")) : nl;
protected final String TEXT_1 = "Hello, ";
protected final String TEXT_2 = "!" + NL + "The current time is ";
protected final String TEXT_3 = ". ";
protected final String TEXT_4 = NL;
protected final String TEXT_5 = NL;
public String s = "Mission Completed!";
private Date getCurrentDate() {
return new Date();
}
public String generate(Object argument)
{
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
stringBuffer.append(((List)argument).get(0).toString());
stringBuffer.append(TEXT_2);
stringBuffer.append(getCurrentDate());
stringBuffer.append(TEXT_3);
stringBuffer.append(TEXT_4);
stringBuffer.append(s);
stringBuffer.append(TEXT_5);
return stringBuffer.toString();
}
}
在这里有一点需要注意,JET 对模板文件的编译只会将其内容编译到最后一个方法中。因此,骨架最后一个方法必须为 public String generate(Object argument),若将其他方法放在最后,代码执行类在将模板编译后与骨架进行合并时会出错。
示例 3 使用 JMerger 实现代码合并(demo3)
JET 可以根据事先编辑好的模板文件生成代码,并且还支持重复生成。实际项目开发中,有时需要将自动生成的代码进行手工修改,这时如果因某种原则需重新执行代码生成,会导致手工编写的代码丢失。在 JET 中解决此类问题的方法是代码合并技术,它能将自动生成的内容和手工编写的内容区分开,在必要时进行合并,JET 中负责合并代码的类是 JMerger 。本示例讨论利用 JMerger 对代码进行合并的技术。
基于Eclipse平台的代码生成技术(5)
时间:2012-02-26 IBM 吕锋 于沛 王轩
执行 JET 引擎的程序代码如下。
清单 7. JET 引擎的程序代码
// 模板文件所在插件项目的名称
String pluginId = "demo3";
// 模板文件在项目中的路径及文件名
String uri = Platform.getBundle(pluginId).getEntry("/").toString();
uri += "templates/demo4.jet";
// 声明 JETEmitter
JETEmitter emitter = new JETEmitter(uri);
IProgressMonitor progress = new NullProgressMonitor();
// 声明一个 Map 作为数据变量集的 container
Map argument = new HashMap();
argument.put("fileName", fileName);
argument.put("className", fileName.substring(0, fileName.indexOf(".")));
// 对当前模板进行转换并将需要输出成实际文件的内容返回以便通过输出流输出
String result = emitter.g
|