今天心血来潮想自己手撸一个对象拷贝工具学习学习,感觉很不错,使用纯原生java,不依赖任何工具类,健壮性就不优化了。技术主要用到了反射和stream,赶快来试试,炒鸡好用!
/**
* 对象拷贝注入
* 参数1 源有数据的对象,参数2需要转换成为的对象CLass,参数3需要排除的参数1中的字段
*/
public static <T> T copyBean(Object obj, Class<T> target, String... attrs) {
try {
//排除序列化字段
String[] strings = Arrays.copyOf(attrs, attrs.length + 1);
strings[attrs.length] = "serialVersionUID";
//构建copy对象
T t = target.getDeclaredConstructor().newInstance();
//目标字段名集合
List<String> targetNameList = Arrays.stream(target.getDeclaredFields()).map(Field::getName).toList();
//copy对象
Arrays.stream(obj.getClass().getDeclaredFields()).filter(e -> !Arrays.asList(strings).contains(e.getName())).forEach(e -> {
if (targetNameList.contains(e.getName())) {
try {
//获取源属性值
Object result = obj.getClass().getDeclaredMethod("get" + (e.getName().substring(0, 1).toUpperCase() + e.getName().substring(1)))
.invoke(obj);
//注入
Field field = target.getDeclaredField(e.getName());
field.setAccessible(true);
field.set(t, result);
} catch (Exception v) {
v.printStackTrace();
throw new RuntimeException("拷贝出现异常!");
}
}
});
return t;
} catch (Exception e) {
throw new RuntimeException("拷贝出现异常!");
}
}
运行效果:
成功注入!