【问题标题】:Programmatically specify implementation of derived attributes以编程方式指定派生属性的实现
【发布时间】:2016-06-15 11:04:32
【问题描述】:

我想在 ecore 模型中使用 derived 属性和引用,但到目前为止,我还没有找到任何关于如何为计算派生属性/引用值的方法设置代码的文档。

据我了解,基本工作流程是将属性/引用标记为derived,生成模型代码,然后手动添加实现。但是,我使用通过 Ecore API 动态生成的模型。有没有办法获取一个字符串并将这个字符串指定为计算派生特征的实现,而无需手动编辑生成的文件?

编辑>

澄清一下:我正在寻找一种方法来直接更改生成的 Java 文件,方法是为派生的 EStructuralFeatures 的 getter 指定方法主体(作为字符串)。

【问题讨论】:

    标签: eclipse-emf emf eclipse-emf-ecore ecore


    【解决方案1】:

    EMF 提供了一种使用“调用委托”处理EOperationderived 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

    (请注意,我从未体验过这种机制。我知道它存在,但我从未玩过它。)

    编辑>

    似乎问题与派生属性的动态代码执行无关,而是与代码注入有关(我误解了“有没有办法获取一个字符串并将这个字符串指定为计算派生特征的实现?”)。

    EMF 提供了一种将放在ecore 元模型上的代码直接注入生成代码的方法。

    这是EAttributederived 属性的方式。 EAttribute 应将以下属性设置为true{derived volatile}(您也可以添加transient)。如果您只需要一个 getter 而不是 EAttribute 的 setter,您还可以将属性 changeable 设置为 false

    一旦您的EAttribute 被很好地“配置”,您必须添加一个新的EAnnotation,并将源设置为http://www.eclipse.org/emf/2002/GenModel,并将一个key 设置为getvalue 设置为的条目您将被注入的代码(见下图)。

    ,您的代码将使用注入到您的 getter 中的 value 值生成。

    您可以使用body 代替getEOperation 添加相同的进程。

    【讨论】:

    • 这看起来像是一种将字符串放入生成的输出的非常复杂的方法。但我想它也有必要允许反射访问。这是否意味着手动添加代码的派生属性不适用于动态 EMF?
    • 我给你的解决方案不会将代码注入到你生成的代码中,而是会在你访问属性时解释“代表实现的字符串”。如果您只使用动态 EMF(不生成 ecore 实现),此方法也适用。如果您的ecore 中没有注释并且您生成的代码中没有“手动实现”,EMF 将使用您在代码中添加的实现(只要生成的模型插件加载和注册良好)。对于从元模型到生成代码的代码注入,过程是不同的(参见编辑后的帖子)
    • 所以,为了澄清我是否理解这一点:您的解决方案在技术上并没有按照我的要求执行(更改生成的代码),但它确实将运行时行为更改为相同的效果。无论如何,这就是我真正需要的。公平地说,我的问题并没有明确说明我想操纵生成的输出代码。
    • 我编辑了帖子,您需要遵循在生成的模型实现中注入代码的过程。
    • 我希望我能再投一个赞成票,这正是我想要的。我将编辑问题以强调有关更改输出的部分。感谢您提供这么多的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多