WEB开发网
开发学院软件开发Java 使用 Eclipse Modeling Framework 进行建模,第 2... 阅读

使用 Eclipse Modeling Framework 进行建模,第 2 部分:使用 Eclipse 的 Java Emitter Templates 生成代码

 2009-12-17 00:00:00 来源:WEB开发网   
核心提示: 清单 7. JETEmitter 的简单用法(通常是错误的)Stringuri="platform:/templates/MyClass.javajet";JETEmitterjetEmitter=newJETEmitter(uri);Stringgenerated=jetE


清单 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} );   

上一页  2 3 4 5 6 7 8  下一页

Tags:使用 Eclipse Modeling

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接