问题/问题

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

public class BankAccount {
    String ownerName;
    int accountNumber;

    // ...
}


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

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

自己的想法

就个人而言,我认为这是不可能的。

我只能想到两种方式,这两种方式都花费了很多精力并且不容易实现。


创建一个反映原始类(EBankAccount,将ownerNameaccountNumber作为EAttributes的)的Ecore模型,以及通过将其对象复制到相应的EStructuralFeatures并包裹原始对象来包装原始对象的实用方法/机制EAdapter负责同步两个对象。
钩入EMF.CodeGen并在其中做一些魔术,使生成的代码中的原始类成为超类成为可能,同时仍满足EMF约定(=实现EObject接口等)。


但是,也许有一些EMF(或现有扩展)的隐藏功能可以按照这些原则执行某些操作,而我不知道吗?

最佳答案

我不清楚您真正想要的是什么,但我将尝试描述几种选择。

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

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

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


您描述的第一个选项(我假设您的意思是要同步2个对象,而不是2个类)似乎是最简单的选项,并且我认为如果通过反射使用某种通用方法,则不会花费太多精力。
如果将对象放在非常具体的位置,这可能是一个很好的解决方案,因此只需要在特定的位置包装和解开包装即可。否则,您将需要一直进行转换以转换(包装/展开)对象。
也有可能,但是肯定要付出更多的努力,因为扩展Java JET模板并不容易


我不知道对此有任何扩展。

关于java - 是否可以在EMF中将POJO作为ESuperType?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38504702/

10-11 08:16