快速业务通道

使用EMF进行元建模:生成具体、可重用的Java代码片段 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
,3 个 LocalVariable 之后是 3 个 Statement。第一个是 Invoke,它使用 CalendarType 元素上的 getInstance(),为 calendar 变量分配一个值,与图 10 中的操作类似。

接下来是对 calendar 变量执行的 set() 方法的 Invoke,现在它传递 3 个与 EOperationImpl 参数(year、month 和 date)相对应的 Arg。

图 13. 带有参数的 set()

图 14. FieldReferenceAssignment

根据我们的元模型,这个元素将会生成与 DAY = Calendar.DAY_OF_WEEK; 类似的 Java 代码。

在图 15 中,DAY 变量用于这个 EOperationImpl 的最后一个 Invoke:一个 get(),其返回值被分配给变量 result(我们的实现的 Return Ref)

图 15. Return Ref

使用EMF进行元建模:生成具体、可重用的Java代码片段(9)

时间:2010-11-03 IBM Ken McNeill

实现动态模板

我们现在设计了一个扩展的元模型,并用其描述了一个具体的模型 My.ecore(请参见上述的 EMF V2.5+ 文件名称说明)。现在终于可以用 JET 最终实现一些代码实现了。要查看 JET 模板的语法突出显示功能,您需要安装 JET Editor Plugin。

默认情况下,在为模型生成代码时,EMF 不会使用动态模板。它使用预构建的 Java 类。要开始定制 JET 模板,我们需要从插件 JAR 文件 org.eclipse.emf.codegen.ecore_2.3.0.XYZ.jar 复制一些文件,其中 XYZ 是 Eclipse 插件文件夹中您的 EMF 版本的时间戳。本文使用 org.eclipse.emf.codegen.ecore_2.3.0.v200706262000.jar。要复制这些文件,请使用任意一种解压缩工具打开 JAR 文件,并执行以下操作:

从这个 JAR 文件将模板目录提取到您的具体模型的 Java 项目中。

在模板/模型中创建一个目录,名为 Class。

在 Class 文件夹中创建一个新的空文件,名为 implementedGenOperation.TODO.override.javajetinc 。

由名称可以看出,第 3 步中的新文件是一个 JET 模板,我们将在其中加入模型对象 EOperationImpl 的代码生成逻辑。默认情况下,这个文件并不存在,因为 EMF 只为每个 EOperation 提供一个空的方法签名。一旦激活了动态模板功能,我们的新文件将被作为 Java 方法体自动包括,正如 EOperationImpl 所定义的。

以下是 implementedGenOperation.TODO.override.javajetinc 的完整代码。

清单 3. implementedGenOperation

// created by implementedGenOperation.TODO.override.javajetinc
><%
>if ( ! (genOperation.getEcoreOperation() instanceof EOperationImpl) ) { %>
>	// TODO: implement this method
>	// Ensure that you remove @generated or mark it @generated NOT
>		throw
>				new UnsupportedOperationException();
><% } else { %>
>	// ** EOperationX implementation **
><% EOperationImpl opx = (EOperationImpl)genOperation.getEcoreOperation();
>Statement stm = null;
>Iterator iterator = null;
>EList<LocalVariable> pList = opx.getLocalVariables();
>LocalVariable lvar = null;
>String iname = null;
>StringBuffer paramsString = null;
>StringBuffer varString = null;
>for (int i = 0;i < pList.size(); i++) {
>	lvar = pList.get(i);
>	iname = lvar.getEType().getInstanceClassName();%>
>				<%=iname%>
>				<%=lvar.getName()%><%
>				if (iname.startsWith("java")) { %> = null
>				<% } %>;
><% }
>iterator = opx.getStatements().iterator();
>while (iterator.hasNext()) {
>	paramsString = new StringBuffer();
>	varString = new

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号