是否可以从Ecore元模型生成Java代码,而无需EMF的依赖关系?生成"干净的代码",就好像它是从 UML 模型生成一样。
简单的方法是在顶级节点的"模型特征默认值"部分中设置 GenModel 选项"抑制 EMF 类型"...有相关选项的孔集。有关完整详细信息,请参阅EMF书籍(第2版(。
您还可以使用 JET 从 ECore 模型生成自己的 Java 代码。查看"使用 EMF 进行元建模:生成具体的、可重用的 Java 片段",了解相当详细的描述。
并非所有内容都可以使用 EMF 模型编辑器删除。#eSet
、#eGet
等方法必须在底层模板中删除。可以通过设置"操作反射"= false来删除eInvoke
方法。可以删除 util 软件包,设置软件包级别配置"适配器工厂"= false。还有其他更改可以从 genmodel 配置中进行管理 - 有关更多详细信息,请参阅 EMF 建模框架手册第 12.3.1 节。
请注意,"抑制 EMF 类型"仅从EOperation
和EReference
getter 和 setter 中删除 EMF 类型,而不会从声明的 ivar 或 getter 中使用的构造函数中删除 EMF 类型(如果 list 为 null(。这些必须在模板中进行更改 - 具体是Class.javajet。有关如何替换核心 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)%>;