使用 Eclipse Modeling Framework 进行建模,第 2 部分:使用 Eclipse 的 Java Emitter Templates 生成代码
2009-12-17 00:00:00 来源:WEB开发网
清单 7. JETEmitter 的简单用法(通常是错误的)String uri = "platform:/templates/MyClass.javajet";
JETEmitter jetEmitter = new JETEmitter( uri );
String generated = jetEmitter.generate( new NullProgressMonitor(), new Object[]{argument} );
如果您试图在一个标准的 main() 方法中运行这段代码,就会发现第一个问题。 generate() 方法会触发一个 NullPointerException 异常,因为 JETEmitter 假设自己正被一个插件调用。在初始化过程中,它将调用 CodeGenPlugin.getPlugin().getString() ,这个函数会失败,因为 CodeGenPlugin.getPlugin() 为空。
解决这个问题有一个简单的方法:将这段代码放到一个插件中,这样的确可以管用,但却不是完整的解决方法。现在 JETEmitter 的实现创建了一个隐藏项目 .JETEmitters ,其中包含了所生成的代码。然而, JETEmitter 并不会将这个插件的 classpath 添加到这个新项目中,因此,如果所生成的代码引用了任何标准 Java 库之外的对象,都将不能成功编译。2.0.0 版本初期似乎解决了这个问题,但是到 4 月初为止,这还没有完全实现。要解决这个问题,必须对 JETEmitter 类进行扩充,使其覆盖 initialize() 方法,并将其加入您自己的 classpath 项中。Remko Popma 已经编写了很好的一个例子 jp.azzurri.jet.article2.codegen.MyJETEmitter ,这个例子可以处理这个问题,在 JET 增加这种正确的特性之前都可以使用这种方法。修改后的代码如清单 8 所示。
清单 8. 正确的 JETEmitter 调用String base = Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
String uri = base + "templates/GenTestCase.javajet";
MyJETEmitter jetEmitter = new MyJETEmitter( uri );
jetEmitter.addClasspathVariable( "JET_EXAMPLE", PLUGIN_ID);
String generated = jetEmitter.generate( new NullProgressMonitor(),
new Object[]{genClass} );
- 中查找“使用 Eclipse Modeling Framework 进行建模,第 2 部分:使用 Eclipse 的 Java Emitter Templates 生成代码”更多相关内容
- 中查找“使用 Eclipse Modeling Framework 进行建模,第 2 部分:使用 Eclipse 的 Java Emitter Templates 生成代码”更多相关内容
- 上一篇:使用 Eclipse Modeling Framework 进行建模,第 3 部分:使用 Eclipse 的 JMerge 定制生成的代码和编辑器
- 下一篇:用 Eclipse Modeling Framework 实现模型驱动开发,第 1 部分:创建 UML 模型并生成代码
更多精彩
赞助商链接