给定任何Class<?> clazz
对象,是否有一个API来获取其模型实例实现EClass
的clazz
? (即eClass
为true的eClass.getInstanceClass().equals(clazz)
)
如果我有一个eObject
,我可以简单地调用eObject.eClass()
以获得EClass
。但就我而言,我没有这种情况。我只有一个模型实例类,并且需要关联的EClass
来调用EcoreUtil.create(eClass)
。
最佳答案
为了说明答案,我假设像您上一个答案一样,我们有一个名为Foo
的元模型,关联的包是FooPackage
,关联的工厂是FooFactory
。在这个元模型中,我假设我们有A
和B
。
为了使关联的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"));
您可以浏览代码,也许可以为您提供帮助。
希望我理解你的问题。