gpt4 book ai didi

java - 从 EMF 模型实例类中获取 EClass

转载 作者:行者123 更新时间:2023-12-01 14:08:30 24 4
gpt4 key购买 nike

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

如果我有 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
}

请注意,此时,您必须确保您将尝试创建的接口(interface) (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"));

你可以浏览一下代码,或许对你有帮助。

希望我能正确理解您的问题。

关于java - 从 EMF 模型实例类中获取 EClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com