Чтобы проиллюстрировать ответ, я предполагаю, что у нас есть метамодель с именем 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);
}
После этого вам нужно будет иметь дело с динамическими экземплярами (вашим 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"));
Вы можете просмотреть код, возможно, это может вам помочь.
Надеюсь, я правильно понял вашу проблему.
person
Vincent Aranega
schedule
09.06.2016
clazz
изobj.getClass()
, гдеobj
является экземпляромEObject
, или вы получаетеclazz
, используяInterfaceName.class
в своем коде (например, в UML,Activity.class
)? - person Vincent Aranega   schedule 09.06.2016InterfaceName.class
, потому что на тот момент у меня не былоobj
. Он хочет предоставить методcreate(InterfaceName.class)
в качестве альтернативыcreate(eClass)
, потому что он может быть типобезопасным и, насколько мне известно, для получения EClass мне нужно либо получить его по имени (ePackage.getEClassifier("MyClass")
), либо мне нужно будет использовать странные ссылки наMyPackage.Literals.MY_CLASS
чего я хотел бы избежать - person kapex   schedule 09.06.2016