是否可以从 Ecore 元模型生成 Java 代码,而不依赖 EMF?生成“干净的代码”,就好像它是从 UML 模型生成的一样。
2 回答
简单的方法是在顶层节点的“模型特征默认值”部分设置 GenModel 选项“抑制 EMF 类型”......有相关选项的孔集。有关完整的详细信息,请参阅 EMF 书(第 2 版)。
您还可以使用 JET 从 ECore 模型生成您自己的 Java 代码。查看“使用 EMF 进行元建模:生成具体的、可重用的 Java 片段”以获得相当详细的描述。
并非所有内容都可以使用 EMF 模型编辑器删除。, #eSet
,#eGet
等方法必须在基础模板中删除。eInvoke
可以通过设置“Operation Reflection”=false 来移除该方法。可以删除 util 包设置包级别配置“适配器工厂”= false。可以从 genmodel 配置管理其他更改 - 请参阅 EMF 建模框架书,第 12.3.1 节了解更多详细信息。
请注意,“抑制 EMF 类型”仅从 getter 和 setter 中删除 EMF 类型,EOperation
但EReference
不会从声明的 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.getListItemType()%>>();
instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;