我想通过以下方式迭代类字段
我有课
public class Parent{
String name;
String lastName;
}
public class Child extends Parent{
int childNumber;
}
在父类中我想要一个“get”方法
child 将继承
此方法将按字段名称返回字段的值
如何检索字段的值?
我想要的方法是这样的:
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)
最佳答案
要获取此堆栈跟踪,您必须将字符串值传递给 field.get
,而不是 this
。进行完全重建并再次测试。
以下是 UnsafeFieldAccessorImpl 类中的相关方法,如您所见,如果您尝试传入一个 String 而不是可从声明字段的类:
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;
}
关于java - 如何获取该类中某个字段的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291954/