我想在ecore模型中使用derived
属性和引用,但到目前为止,我还没有找到有关如何为计算派生属性/引用值的方法设置代码的任何文档。
据我了解,基本工作流程是将属性/引用标记为derived
,生成模型代码,然后手动添加实现。但是,我使用通过Ecore API动态生成的模型。有没有办法获取String并指定此String作为计算派生特征的实现,而无需手动编辑生成的文件?
编辑>
澄清:我正在寻找一种直接更改生成的Java文件的方法,方法是为派生的EStructuralFeatures的getter指定方法体(作为字符串)。
答案 0 :(得分:5)
EMF提供了一种使用“调用委托”处理EOperation
和derived EAttribute
的专用实现的方法。此功能允许您以字符串格式将某些实现直接放在ecore
元模型中(一旦EMF“处理”所使用的语言,即存在调用委托)。
据我所知,OCL得到了很好的支持:https://wiki.eclipse.org/OCL/OCLinEcore#Invocation_Delegate
调用委托的注册可以通过插件注册或手工(对于独立使用)来执行,并且该机制适用于EMF反射层(动态EMF):https://wiki.eclipse.org/EMF/New_and_Noteworthy/Helios#Registering_an_Invocation_Delegate
(请注意,我从未体验过这种机制。我知道它存在,但我从未玩过它。)
<强>编辑&gt; 强>
似乎这个问题与派生属性的动态代码执行无关,而与代码注入无关(我误解了“有没有办法获取字符串并指定此字符串作为计算派生特征的实现?“)。
EMF提供了一种将ecore
元模型上放置的代码直接注入生成的代码的方法。
EAttribute
具有derived
属性的方式。 EAttribute
应将以下属性设置为true
:{derived volatile}
(您还可以添加transient
)。如果您只需要EAttribute
的getter而不是setter,则还可以将属性changeable
设置为false
。
在EAttribute
配置完好后,您必须添加一个新的EAnnotation
,其源设置为http://www.eclipse.org/emf/2002/GenModel
,并且key
的条目设置为{ {1}}和get
设置为您要注入的代码(参见下图)。
voilà,您的代码将使用您的getter中注入的value
值生成。
您可以使用value
代替EOperation
为body
添加相同的流程。