基于反射机制的 EMF 模型比较
2010-07-06 00:00:00 来源:WEB开发网当确定两个对象具有可比性之后,需要遍历字段列表 _featureList,获取并比较两个对象中相同字段的值。因为需要比较的字段来自不同的建模类,并且本例中这些字段被放置在一个列表内,所以需要判断某字段是否可以用于一个对象的方法。清单 6 列出了完成这一功能的代码片断,函数 isSuitable() 递归遍历一个类型及其所有超类型,判断参数 feature 是否适用于此对象。
清单 6. 判断一个 EStructuralFeature 是否适用于一个对象
public static boolean isSuitable(EObject eo, EStructuralFeature feature)
{
if (eo == null)
return false;
return isSuitable(eo.getClass(), feature);
}
private static boolean isSuitable(Class c, EStructuralFeature feature)
{
Class[] interfaces = c.getInterfaces();
for (int m = 0; m < interfaces.length; m++)
{
if (interfaces[m] == feature.getContainerClass()
|| isSuitable(interfaces[m], feature))
{
return true;
}
}
return false;
}
如果一个 EStructuralFeature 适用于两个对象,则用 eGet() 方法获取两个对象在该字段的值并进行比较。通过 EMF 反射 API 取值和根据得到值的不同类型进行比较的细节同第 3 章。ModelComparePort 类的列表类型变量 _comparedNodes 是用作记录已经比较过节点的备忘录,在进行比较之前需要查阅备忘录避免重复比较,在比较之后需要更新备忘录。比较器发现两个对象的不同便生成一个 CompareInfo 对象,最终得到一个由 CompareInfo 对象组成的差异项列表,关键代码如清单 7 所示:
更多精彩
赞助商链接