0

问题/问题

给定一个来自非 EMF 感知 API 的普通 Java 类,例如

public class BankAccount {
    String ownerName;
    int accountNumber;

    // ...
}

并且让我们假设我不允许更改或重新编译这个类(因为它来自 API)。

是否有任何简单的方法可以将此类用作 EMF 中 EClass 的 ESuperType?(当然,单个类只是一个示例。我需要包装一个由 30-50 个类组成的 API ...)。

自己的想法

就个人而言,我认为开箱即用是不可能的。

我只能想到两种方法,都比较费力,也不容易实现。

  1. 创建一个 Ecore 模型,它反映了原始类(EBankAccount、 haveownerNameaccountNumberas EAttributes)和一个实用方法/机制,该实用方法/机制通过将原始对象的字段复制到相应的对象中EStructuralFeatures并添加EAdapter负责同步两个对象的 s 来包装原始对象。

  2. 连接到 EMF.CodeGen 并在那里做一些魔术,这使得在生成的代码中可以将原始类作为超类,同时仍然履行 EMF 合同(= 实现EObject接口等)。

但也许 EMF (或现有的扩展)有一些隐藏的功能可以按照这些方式做一些事情,我不知道吗?

4

1 回答 1

3

我不清楚你真正想要什么,但我会尝试描述几个选项。

如果您只想扩展 POJO(这是问题文本所建议的),答案是肯定的,您可以简单地向您的模型添加一个新的 EClass,并在“实例类型名称”属性中引用 POJO 限定名称。然后,您可以创建从该类扩展的其他类,但其状态不会由 EMF 管理。

但是,如果您希望 EMF 跟踪 POJO 状态,就好像它是一个真正的 EMF 对象(因此这些属性也是 EStructuralFeature),那么我没有看到其他解决方案,您确实需要完全在 EMF 中对其进行建模。

在第二种情况下,您描述的两个选项似乎都是可能的。

  1. 您描述的第一个选项(我假设您的意思是要同步 2 个对象,而不是 2 个类)似乎是最简单的选项,如果您通过反射使用一些通用方法,我认为不会花费太多精力.
    如果您将对象放在非常具体的位置,这可能是一个很好的解决方案,因此您只需要在特定位置进行包装和展开。否则,您将需要一直转换(包装/展开)对象。

  2. 也有可能,但肯定需要更多的努力,因为扩展 Java JET 模板并不容易

我不知道有任何扩展。

于 2016-07-22T16:12:43.840 回答