以编程方式指定派生属性的实现
Programmatically specify implementation of derived attributes
我想在 ecore 模型中使用 derived
属性和引用,但到目前为止我还没有找到任何关于如何为计算派生值的方法设置代码的文档 attributes/references.
据我了解,基本的工作流程是将一个attribute/reference标记为derived
,生成模型代码,然后手动添加实现。但是,我使用通过 Ecore API 动态生成的模型。有没有一种方法可以获取一个字符串并将此字符串指定为派生特征计算的实现,而无需手动编辑生成的文件?
编辑>
澄清一下:我正在寻找一种方法来直接更改生成的 Java 文件,方法是为派生的 EStructuralFeatures 的获取器指定方法主体(作为字符串)。
EMF 提供了一种使用 "invocation delegate" 处理 EOperation
和 derived EAttribute
的专用实现的方法。此功能允许您以字符串格式将一些实现直接放在 ecore
元模型中(只要使用的语言可以是 EMF "handled",即存在调用委托)。
据我所知,OCL 得到了很好的支持:https://wiki.eclipse.org/OCL/OCLinEcore#Invocation_Delegate
调用委托的注册通过插件注册或手动(独立使用)进行,该机制与 EMF 反射层(动态 EMF)一起工作:https://wiki.eclipse.org/EMF/New_and_Noteworthy/Helios#Registering_an_Invocation_Delegate
(请注意,我从未体验过这种机制。我知道它存在,但我从未玩过它。)
编辑>
看来这个问题与派生属性的动态代码执行无关,而是与代码注入有关(我误解了"Is there a way to take a String and specify this String as the implementation for the computation of the derived feature?")。
EMF 提供了一种将放置在 ecore
元模型上的代码直接注入到生成的代码中的方法。
这是 EAttribute
和 derived
属性 的方法。 EAttribute
应将以下属性设置为 true
:{derived volatile}
(您也可以添加 transient
)。如果您只想要 getter 而 EAttribute
不需要 setter,您还可以将 属性 changeable
设置为 false
.
一旦您的 EAttribute
正常 "configured",您必须添加一个新的 EAnnotation
并将源设置为 http://www.eclipse.org/emf/2002/GenModel
和一个带有 [=26= 的条目] 设置为 get
和 value
设置为将要注入的代码(见下图)。
并且 voilà,您的代码将使用注入到 getter.
中的 value
值生成
您可以使用 body
而不是 get
为 EOperation
添加相同的进程。
我想在 ecore 模型中使用 derived
属性和引用,但到目前为止我还没有找到任何关于如何为计算派生值的方法设置代码的文档 attributes/references.
据我了解,基本的工作流程是将一个attribute/reference标记为derived
,生成模型代码,然后手动添加实现。但是,我使用通过 Ecore API 动态生成的模型。有没有一种方法可以获取一个字符串并将此字符串指定为派生特征计算的实现,而无需手动编辑生成的文件?
编辑>
澄清一下:我正在寻找一种方法来直接更改生成的 Java 文件,方法是为派生的 EStructuralFeatures 的获取器指定方法主体(作为字符串)。
EMF 提供了一种使用 "invocation delegate" 处理 EOperation
和 derived EAttribute
的专用实现的方法。此功能允许您以字符串格式将一些实现直接放在 ecore
元模型中(只要使用的语言可以是 EMF "handled",即存在调用委托)。
据我所知,OCL 得到了很好的支持:https://wiki.eclipse.org/OCL/OCLinEcore#Invocation_Delegate
调用委托的注册通过插件注册或手动(独立使用)进行,该机制与 EMF 反射层(动态 EMF)一起工作:https://wiki.eclipse.org/EMF/New_and_Noteworthy/Helios#Registering_an_Invocation_Delegate
(请注意,我从未体验过这种机制。我知道它存在,但我从未玩过它。)
编辑>
看来这个问题与派生属性的动态代码执行无关,而是与代码注入有关(我误解了"Is there a way to take a String and specify this String as the implementation for the computation of the derived feature?")。
EMF 提供了一种将放置在 ecore
元模型上的代码直接注入到生成的代码中的方法。
这是 EAttribute
和 derived
属性 的方法。 EAttribute
应将以下属性设置为 true
:{derived volatile}
(您也可以添加 transient
)。如果您只想要 getter 而 EAttribute
不需要 setter,您还可以将 属性 changeable
设置为 false
.
一旦您的 EAttribute
正常 "configured",您必须添加一个新的 EAnnotation
并将源设置为 http://www.eclipse.org/emf/2002/GenModel
和一个带有 [=26= 的条目] 设置为 get
和 value
设置为将要注入的代码(见下图)。
并且 voilà,您的代码将使用注入到 getter.
中的value
值生成
您可以使用 body
而不是 get
为 EOperation
添加相同的进程。