3

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

4

2 回答 2

2

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

您还可以使用 JET 从 ECore 模型生成您自己的 Java 代码。查看“使用 EMF 进行元建模:生成具体的、可重用的 Java 片段”以获得相当详细的描述。

于 2012-05-19T20:59:36.757 回答
0

并非所有内容都可以使用 EMF 模型编辑器删除。, #eSet,#eGet等方法必须在基础模板中删除。eInvoke可以通过设置“Operation Reflection”=false 来移除该方法。可以删除 util 包设置包级别配置“适配器工厂”= false。可以从 genmodel 配置管理其他更改 - 请参阅 EMF 建模框架书,第 12.3.1 节了解更多详细信息。

请注意,“抑制 EMF 类型”仅从 getter 和 setter 中删除 EMF 类型,EOperationEReference不会从声明的 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 EListimpl 替换为ArrayList

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

instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
于 2012-09-13T14:10:13.927 回答