需求:当一个对象保存到数据库中的时候,此时,此对象只包含部分属性。其他的属性依旧不变(其他修改操作会改变)。我们需要把确认要改变的属性赋值到需要改变的新的对象中。以此保存数据。字段少还好说,字段较多那么就麻烦大了。如果此种需求很大。那么就更废了。更不用说可能需要改变部分字段(添加,减少)是否在修改中。只能重新找,然后修改。太麻烦了。
那么,我们怎么做呢?用反射。以前也用过反射,只是没有做一个记录备案。现在,弄出来吧。下次直接拷贝就好了。直接上代码。
/**
* 两个对象之间的赋值
* @param source 来源对象
* @param dest 去处对象
* @return 去除对象
* @throws IllegalAccessException
* @throws NoSuchMethodException
* @throws InvocationTargetException
*/
public static Object getAttribute(Object source,Object dest) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Field[] declaredFields = source.getClass().getDeclaredFields();
LinkedHashMap<String,Object> hashMap = new LinkedHashMap<>();
for(Field f:declaredFields){
//打开私有访问
f.setAccessible(true);
//获取属性
String name = f.getName();
if(name!="username"){
if(f.get(source)!=null) {
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
Method method = source.getClass().getMethod(methodName, f.getType());
method.invoke(dest, f.get(source));
}
}
}
return dest;
解释:反射的方法不解释了。这个已经记住了。但是,获取Method的方法并没有记者。在此打一下,增加记忆。
source.getClass().getMethod(methodName,'methodName的方法的参数类型');
method.invoke('去除的对象',"属性值")