是否可以从Ecore元模型生成Java代码,而不依赖EMF?生成“干净代码”,好像它是来自UML模型的一代。
答案 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类型”仅从EOperation
和EReference
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.getListItemType()%>>();
instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;