使用EMF进行元建模:生成具体、可重用的Java代码片段 - 编程入门网
,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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |