给定任何Class<?> clazz对象,是否有一个API来获取其模型实例实现EClassclazz? (即eClass为true的eClass.getInstanceClass().equals(clazz))

如果我有一个eObject,我可以简单地调用eObject.eClass()以获得EClass。但就我而言,我没有这种情况。我只有一个模型实例类,并且需要关联的EClass来调用EcoreUtil.create(eClass)

最佳答案

为了说明答案,我假设像您上一个答案一样,我们有一个名为Foo的元模型,关联的包是FooPackage,关联的工厂是FooFactory。在这个元模型中,我假设我们有AB

为了使关联的EClass成为EClass,您可以使用以下命令:

String aName = A.class.getSimpleName();
EClassifier classif = FooPackage.eInstance.getEClassifier(aName);
if (classif != null && classif instanceof EClass) {
  // At this point, you have the right EClass,
  // you can now create an instance using the factory
  EObject myinstance = FooFactory.eInstance.create((EClass)classif);
}

在那之后,您将需要处理动态实例(您的EObject),除非您使用以下方式将A.class显式转换为myinstance:
A instance = (A) myinstance;
// or
A instance = A.class.cast(myinstance);

如果将所有这些都放在一个方法中,它可能看起来像这样:
public static <T> T create(java.lang.Class<T> clazz) {
  String iName = clazz.getSimpleName();
  EClassif classif = FooPackage.eInstance.getEClassifier(iName);
  if (classif != null && classif instanceof EClass) {
    return clazz.cast(FooFactory.eInstance.create((EClass)classif));
  }
  return null; // or throw exception, clazz not found or stuff like that
}

请注意,此时,您必须确保将尝试创建的接口(A)确实是A.class且不是抽象的,否则将引发异常。

为了处理这类问题,我在几个月前开始编写一种库:https://github.com/aranega/dynemf

它尚未完全记录,但是您可以执行以下操作:
EPackageWrapper mymm = ePackage(FooPackage.eINSTANCE);
mymm.create(A.class)
  .set("name", "MyAInstance")
  .set("bRels", mymm.create(B.class)
                  .set("name", "MyB1"));

您可以浏览代码,也许可以为您提供帮助。

希望我理解你的问题。

10-07 20:39