我做到了这一点,但我知道,我强烈支付我认为这被认为是糟糕的编程。 我做到了,因为有人强迫我这样做! (我认为最好的解决办法是编写更多的代码......这是最快的)。
public String getNestedDeclaredField(Object obj, String fieldName) {
if (null == fieldName) {
return null;
}
String[] fieldNames = fieldName.split("\\.");
Field field = null;
Class<? extends Object> requestClass = obj.getClass();
for (String s : fieldNames) {
try
{
field = getSuperClassField(requestClass,
requestClass.getSimpleName(), s);
field.setAccessible(true);
obj = field.get(obj);
if (null == obj) {
return null;
}
requestClass = obj.getClass();
}
catch (Exception e) {
log.error("Error while retrieving field {} from {}", s,
requestClass.toString(), e);
return "";
}
}
return obj.toString();
}
public Field getSuperClassField(Class<? extends Object> clazz,
String clazzName, String fieldName) throws NoSuchFieldException {
Field field = null;
try{
field = clazz.getDeclaredField(fieldName);
}
catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
if (StringUtils.equals(clazz.getSimpleName(), "Object")) {
log.error("Field {} doesn't seem to appear in class {}",
fieldName, clazzName);
throw new NoSuchFieldException();
}
field = getSuperClassField(clazz, clazzName, fieldName);
}
catch (Exception e) {
log.error("Error while retrieving field {} from {}", fieldName,
clazz.toString(), e);
}
return field;
}
哪里fieldName的是(对于zipCd):addr.zip.zipCd
它将从Employee对象检索zipCd的字符串值。
执行setters,然后您将能够设置值。 –
我想使用反射来迭代这种类型的任何Java bean并修改其值。 – Girish
你做这种事情的用例是什么?你是否正在从数据库中读取和读取数据?然后考虑使用JPA或Hibernate。你是序列化还是去序列化JSON/XML /其他格式?然后考虑JAXB或类似的。 – slartidan