我们经常遇到一个集合中替换一个对象的一个字段值和另一个字段值。
比如替换一个集合中所有对象的uid为uname;
可以使用反射,制定原字段名和被替换的字段名
public static Object getFieldValueByObject (Object object , String targetFieldName) throws Exception {
// 获取该对象的Class
Class objClass = object.getClass();
// 获取所有的属性数组
Field[] fields = objClass.getDeclaredFields();
for (Field field:fields) {
// 属性名称
String currentFieldName = "";
// 获取属性上面的注解 import com.fasterxml.jackson.annotation.JsonProperty;
/**
* 举例:
* @JsonProperty("di_ren_jie")
* private String diRenJie;
*/
boolean has_JsonProperty = field.isAnnotationPresent(JsonProperty.class);
if(has_JsonProperty){
currentFieldName = field.getAnnotation(JsonProperty.class).value();
}else {
currentFieldName = field.getName();
}
if(currentFieldName.equals(targetFieldName)){
return field.get(object); // 通过反射拿到该属性在此对象中的值(也可能是个对象)
}
}
return null;
}
public class tool {
/**
* 此方法可将obj对象中名为propertyName的属性的值设置为value。*/
public void setProperty(Object obj, String propertyName, Object value)throws Exception{
Class clazz=obj.getClass(); //获取字节码对象
Field field=clazz.getDeclaredField(propertyName); //暴力反射获取字段
field.setAccessible(true); //设置访问权限
field.set(obj,value); //设置值
}
}