繁体   English   中英

从EMF模型实例类获取EClass

[英]Get EClass from EMF model instance class

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

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

为了说明答案,我将假设我们在您之前的答案中有一个名为Foo的元模型,并且关联的包是FooPackage ,关联的工厂是FooFactory 在这个元模型中,我假设我们有AB ,它们是EClass

为了将关联的EClass提供给A.class ,您可以使用:

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),除非您使用以下内容将myinstance明确地转换为A

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.class )确实是EClass并且不是抽象的,否则将引发异常。

为了处理这类东西,我在几个月前开始编写一种类型的库: 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"));

您可以浏览代码,也许它可以帮助您。

希望我理解你的问题。

我找不到任何API。 EClass及其实例类之间的关系由生成的初始化方法设置,但没有任何反向映射。 原因似乎是没有一对一的关系,因为多个模型元素可以使用相同的实例接口。

如果您确定每个类都使用不同的接口,那么可以自己迭代所有EClassifiers并自己构建映射。

Map<Class<?>, EClass> eClasses = new HashMap<>();
for (final EClassifier eClassifier : FooPackage.eINSTANCE.getEClassifiers()) {
    if (eClassifier instanceof EClass) {
        if(eClasses.put(eClassifier.getInstanceClass(), (EClass) eClassifier) != null) {
            throw new RuntimeException(
                 "Failed to create distinct instance class to EClass mapping for "
                 + Classifier.getInstanceClass());
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM