给定任何Class<?> clazz对象,是否存在用于获取EClass其模型实例实现的API clazz?(即eClass,这eClass.getInstanceClass().equals(clazz)是正确的)
如果我有一个eObject,我可以简单地打电话eObject.eClass()来获取EClass。但就我而言,我没有这种情况。我只有一个模型实例类,需要与之关联EClass的呼叫EcoreUtil.create(eClass)。
为了说明答案,我假设我们有一个Foo像您上一个答案中所述的元模型,关联的包是FooPackage,关联的工厂是FooFactory。在这个元模型,我会假设我们有A和B它们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);
}
Run Code Online (Sandbox Code Playgroud)
在那之后,您将需要处理动态实例(您的EObject),除非您明确地将myinstance其强制转换为A使用此实例:
A instance = (A) myinstance;
// or
A instance = A.class.cast(myinstance);
Run Code Online (Sandbox Code Playgroud)
如果将所有这些都放在一个方法中,它可能看起来像这样:
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
}
Run Code Online (Sandbox Code Playgroud)
请注意,此时,您必须确保要尝试创建的接口(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"));
Run Code Online (Sandbox Code Playgroud)
您可以浏览代码,也许可以为您提供帮助。
希望我理解你的问题。
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |