是否可以在EMF中将POJO作为ESuperType?

时间:2016-07-21 12:47:57

标签: java eclipse emf ecore

问题/问题

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

public class BankAccount {
    String ownerName;
    int accountNumber;

    // ...
}

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

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

自己的想法

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

我只能想到两种方式,既有很多努力又不容易实现。

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

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

  3. 但也许EMF(或现有的扩展程序)的一些隐藏功能可以沿着这些方向做某些事情,我不知道它?

1 个答案:

答案 0 :(得分:3)

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

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

但是如果你想要EMF跟踪那个POJO状态就好像它是一个真正的EMF对象(所以那些属性也是EStructuralFeature),那么我没有看到另一个解决方案,你真的需要在EMF中完全建模它。 / p>

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

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

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

  3. 我不知道有任何延伸。