2013-08-17 14 views
2

我想遍歷類字段以下列方式字段的字段值如何讓這個類

我有類

public class Parent{ 

String name; 
String lastName; 

} 

public class Child extends Parent{ 

int childNumber; 
} 

在我想有一個父類「得到「方法

孩子將繼承

此方法將通過它的名字

返回一個字段的值

我如何檢索該字段的值?

我想的方法是這樣的:

public Object get(String key){ 
      Field field; 
     Object result = null; 
     try { 
      field = this.getClass().getDeclaredField(key); 
      if(field!=null) { 
       field.setAccessible(true); 
      } 
      result = field.get(this); // this is where my problem, i don't know how to retrieve the field's value 
     } catch (NoSuchFieldException | SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

堆棧跟蹤

java.lang.IllegalArgumentException: Can not set int field com.database.User.userID to java.lang.String 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source) 
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(Unknown Source) 
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(Unknown Source) 
    at java.lang.reflect.Field.get(Unknown Source) 
    at com.database.DatabaseObject.get(DatabaseObject.java:106) 
    at com.database.DatabaseObject.set(DatabaseObject.java:128) 
    at com.database.DatabaseObject.getInsertPreparedStatement(DatabaseObject.java:64) 
    at com.database.Database.insert(Database.java:95) 
    at com.lenabru.webservice.ElectronicArenaWebService.register(ElectronicArenaWebService.java:21) 
    at com.database.Main.main(Main.java:29) 
+0

什麼對您提供的代碼段不起作用? – hexafraction

+0

我把堆棧跟蹤的帖子中,java認爲我想設置字段,並沒有得到它 –

+0

你可能會展示你如何使用代碼? (這是什麼'這是指和您試圖訪問的字段的名稱?) –

回答

1

爲了讓您將有這個堆棧跟蹤有一個字符串值傳遞給field.get,不this。做一個完整的重建和測試。

以下是UnsafeFieldAccessorImpl類的相關方法,如您所見,如果您嘗試傳入字符串而不是可從聲明字段的類中分配的對象,則只能獲得給定的,令人困惑的錯誤消息:

protected void ensureObj(Object o) { 
    // NOTE: will throw NullPointerException, as specified, if o is null 
    if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) { 
     throwSetIllegalArgumentException(o); 
    } 
} 

protected void throwSetIllegalArgumentException(Object o) { 
    throwSetIllegalArgumentException(o != null ? o.getClass().getName() : "", ""); 
} 

protected void throwSetIllegalArgumentException(String attemptedType, 
               String attemptedValue) { 
    throw new IllegalArgumentException(getSetMessage(attemptedType,attemptedValue)); 
} 

protected String getSetMessage(String attemptedType, String attemptedValue) { 
    String err = "Can not set"; 
    if (Modifier.isStatic(field.getModifiers())) 
     err += " static"; 
    if (isFinal) 
     err += " final"; 
    err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to "; 
    if (attemptedValue.length() > 0) { 
     err += "(" + attemptedType + ")" + attemptedValue; 
    } else { 
     if (attemptedType.length() > 0) 
      err += attemptedType; 
     else 
      err += "null value"; 
    } 
    return err; 
} 
0

也許,如果你想獲得訪問bean字段使用BeanUtilscommons-beanutils最簡單的方法:

System.out.println(BeanUtils.getProperty(child, "name")); // get value from property 

BeanUtils.setProperty(c, "lastName", "Ivan Ivanov"); // set value to property 
1

我建議你做的兩件事情之一:

  1. 如果你真正的代碼有儘可能少的領域,你在這裏展示的例子中,爲每個字段添加getXxx()方法。例如,Parent應該有getName()(應該是getFirstName()?)和getLastName()方法,而Child應該有getChildNumber()

  2. 如果你的代碼比這更復雜,使用Map,並通過委託給Map實現你get()set()方法。

反思供編程人員構建需要在非常低的水平,以操縱對象複雜的工具。我們其他人通常有更好的解決方案。