[英]Comparing field values using reflection
我試圖以通用方式比較兩個不同對象的字段值。 我有一個函數(如下所示),它接收兩個對象,然后獲取字段,然后比較循環中的字段,如果它們不相同,則將字段添加到列表中 - 這是正確的方法嗎?
public void compareFields(Object qa, Object qa4) throws FieldsNotEqualException
{
Field[] qaFields = qa.getClass().getFields();
Field[] qa4Fields = qa4.getClass().getFields();
for(Field f:qaFields)
{
for(Field f4:qa4Fields)
{
if(f4.equals(f))
{
found = true;
break;
}
else
{
continue;
}
}
}
if(!found)
{
report.add(/*some_formatted_string*/) //some global list
throw new FieldsNotEqualException();
}
}
我在谷歌搜索,我看到C#有一個PropertyInfo類 - Java有這樣的東西嗎? 還有,有沒有辦法像f.getFieldValue()
- 我知道沒有像這樣的方法,但也許有另一種方式???
您可以查看org.apache.commons.lang.builder.EqualsBuilder,如果您想進行現場比較,可以為您節省很多麻煩。
org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals(Object, Object)
如果您想自己比較字段,請查看java.lang.Class.getDeclaredFields()
,它將為您提供包括非公共字段在內的所有字段。
要比較字段的值,請使用f.get(qa).equals(f.get(qa4))
目前,您實際上是在比較字段實例而不是值。
像commons-beanutils這樣的庫如果你想比較bean屬性(getter返回的值)而不是比較字段值,可以幫助你。
但是,如果你想堅持普通反射,你應該:
Class.getDeclaredFields()
而不是Class.getFields()
,因為后者只返回公共字段。 getDeclaredFields()
。 o
),為了獲得該特定對象的某個字段f
的值,你需要調用: f.get(o)
。 //如果你想要一些字段,那么不是所有字段都使用它。
public boolean compareObject(Object object) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
{
String[] compareFields = { "fieldx", "fieldy","fieldz", "field15",
"field19"}; // list of all we need
for(String s : compareFields) {
Field field = DcrAttribute.class.getDeclaredField(s); // get a list of all fields for this class
field.setAccessible(true);
if(!field.get(this).equals(field.get(object))){ //if values are not equal
return true;
}
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.