Ваш вопрос мне интересен.Я очень ищу ваши цели и нахожу небольшую библиотеку, делающую это.Эта библиотека находится в google code
и ее имя jettison
.У этой утилиты есть основной класс с именем Diff4J
, который имеет метод с методом diffs
и сравнивает два объекта и находит различия.
Затем я пишу коды для ваших целей следующим образом:
fisrt определяет Model Object
с именем Bean
:
public class Bean
{
private String name;
private String family;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getFamily()
{
return family;
}
public void setFamily(String family)
{
this.family = family;
}
public Bean()
{
}
public Bean(String name, String family )
{
this.name = name;
this.family = family;
}
}
Затем кодирует тестовый класс следующим образом:
public static void main(String[] args) throws IllegalAccessException,
InvocationTargetException
{
Bean bean_1 = new Bean("Sara", "clooney");
Bean bean_2 = new Bean("Sally", "clooney");
Diff4J comparator = new Diff4J();
Collection<ChangeInfo> diffs = comparator.diff(bean_1, bean_2);
Bean final_result = new Bean();
for(ChangeInfo c : diffs)
{
String filedName = c.getFieldName();
Object to_value = c.getTo();
Object from_value = c.getFrom();
BeanUtilsBean.getInstance().setProperty(final_result, filedName, to_value);
}
System.out.println(final_result);
}
По этому решению, если вы запустите этот код, см. Следующеерезультат:
Bean [family=null, name=Sally]
это результат ваших целей.
Примечание: В последней строке оператора цикла я использовал BeanUtilBean
из Apache Commons Util
для объекта заполненияby Reflection
.
У этой утилиты есть проблема, она не поддерживает Deep Comparator
(возможно, я не смог ее найти), и вам нужно смоделировать эту задачу.
для просмотраэта библиотека находится по адресу http://code.google.com/p/jettison/.
Надеюсь, этот ответ поможет вам.