基于 Eclipse 平台的代码生成技术
2010-07-02 00:00:00 来源:WEB开发网在这里有一点需要注意,JET 对模板文件的编译只会将其内容编译到最后一个方法中。因此,骨架最后一个方法必须为 public String generate(Object argument),若将其他方法放在最后,代码执行类在将模板编译后与骨架进行合并时会出错。
示例 3 使用 JMerger 实现代码合并(demo3)
JET 可以根据事先编辑好的模板文件生成代码,并且还支持重复生成。实际项目开发中,有时需要将自动生成的代码进行手工修改,这时如果因某种原则需重新执行代码生成,会导致手工编写的代码丢失。在 JET 中解决此类问题的方法是代码合并技术,它能将自动生成的内容和手工编写的内容区分开,在必要时进行合并,JET 中负责合并代码的类是 JMerger 。本示例讨论利用 JMerger 对代码进行合并的技术。
执行 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.generate(progress, new Object[] { argument });
// 声明 JMerger
JMerger jmerger = new JMerger();
// 合并规则文件在项目中的路径及文件名
String uri2 = Platform.getBundle(pluginId).getEntry("/").toString();
uri2 += "/templates/emf-merge.xml";
// 声明 JControlModel,作为合并规则
JControlModel controlModel = new JControlModel(uri2);
jmerger.setControlModel(controlModel);
// 在 JMerger 中设置需要合并的源文件内容
jmerger.setSourceCompilationUnit(jmerger
.createCompilationUnitForContents(result));
// 在 JMerger 中设置需要合并的目标文件内容
jmerger.setTargetCompilationUnit(jmerger
.createCompilationUnitForInputStream(new FileInputStream(file
.getLocation().toFile())));
// 对 JMerger 中目标文件与源文件进行内容合并
jmerger.merge();
return new ByteArrayInputStream(jmerger.getTargetCompilationUnit()
.getContents().getBytes());
更多精彩
赞助商链接