如何在没有EMF jar依赖的情况下从Ecore元模型创建Java代码?

时间:2012-05-19 18:27:18

标签: java eclipse code-generation eclipse-emf eclipse-emf-ecore

是否可以从Ecore元模型生成Java代码,而不依赖EMF?生成“干净代码”,好像它是来自UML模型的一代。

2 个答案:

答案 0 :(得分:2)

简单的方法是在顶级节点的“模型特征默认值”部分中设置GenModel选项“抑制EMF类型”......有相关选项的空洞集。有关完整的详细信息,请参阅EMF手册(第2版)。

您还可以使用JET从ECore模型生成您自己的Java代码。有关详细说明,请查看“Metamodeling with EMF: Generating concrete, reusable Java snippets”。

答案 1 :(得分:0)

使用EMF模型编辑器不能删除所有内容。必须在基础模板中删除#eSet#eGet等方法。可以通过设置“Operation Reflection”= false来删除eInvoke方法。可以删除util包,设置包级别配置“Adapter Factory”= false。还可以从genmodel配置中管理其他更改 - 有关更多详细信息,请参阅EMF Modeling Framework一书的第12.3.1节。

请注意,“抑制EMF类型”仅从EOperationEReference getter和setter中删除EMF类型,但不从已声明的ivar或getter中使用的构造函数(如果list为null)中删除。这些必须在模板中更改 - Class.javajet是特定的。有关如何替换核心EMF模板的详细信息,请参阅using-dynamic-templates-in-emf

对于ivar,请使用Feature#getImportedType,而不是Feature#getImportedInternalType

protected <%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%>;

此行跟随注释部分,其中包含isListType测试中的以下内容:

<%} else if (genFeature.isListType() || genFeature.isReferenceType()) {%>
  <%if (genClass.isField(genFeature)) {%>
/**
 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->

对于访问者,请使用以下内容将EMF EList impl替换为ArrayList

<%=genFeature.getSafeName()%> = new <%=genModel.getImportedName("java.util.ArrayList")%><<%=genFeature.getListItemTy‌​pe()%>>();

instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;