做为一名CRUD boy,很是厌烦了Ctrl+C & Ctrl+V的方式进行开发。尤为是在Web类项目开发中,咱们常常会遇到PO(Persistent Object, 持久化对象),DTO(Data Transfer Object, 数据传输对象),VO(View Object, 视图对象)对象之间的转换,毕竟后端总不能把数据库原始数据直接丢给前端进行处理(估计会被🔪),返回一个合适的DTO给前端,是一个优秀CRUD工程师的自觉。前端
一般咱们从数据库查询某个PO对象后,通过一番加工,将其某些属性拷贝给DTO对象或者VO对象返回到前端进行进一步处理或者直接展现。因此代码出现最多的语句就是这几种对象之间各类属性的相互赋值:java
虽然已有对象拷贝的各类类库:BeanUtils,BeanCopier
等,可是在使用上总不是那么顺手,咱们须要一种很是轻量级的对象拷贝方法,因而就有了借助于注解和反射进行对象拷贝的方法。git
之因此采用注解方案有如下几点缘由:github
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface AliasField {
/** * 可供拷贝的属性的名称,以注解中注册的名称优先,寻找名称对应的getter函数 * 第一个找到的getter函数即为源 */
String[] name() default {};
/** * 将源值转换为目标值的方法所在的类,默认为目标对象 */
Class methodClass() default Class.class;
/** * 将源值转换为目标值的方法名称 */
String methodName() default "";
/** * 将源值转换为目标值的方法须要的参数 */
Class[] parameters() default {};
}
复制代码
public class UserTable {
public UserTable(long id, String des, String userId){
this.id = id;
this.des = des;
this.userId = userId;
}
private long id;
private String des;
private String userId;
public long getId(){
return id;
}
public String getDes(){
return des;
}
public String getUserId(){
return userId;
}
}
复制代码
public class UserProtocol {
private long id;
public void setId(long id){
this.id = id;
}
@AliasField(name={"des"})
private String content;
public void setContent(String content){
this.content = content;
}
@AliasField(name={"userId"}, methodName = "String2Int", parameters = {String.class})
private long selfId;
public void setSelfId(long userId){
this.selfId = userId;
}
public static int String2Int(String userId){
return Integer.valueOf(userId);
}
@Override
public boolean equals(Object object){
if(object == null){
return false;
}
else if(object == this){
return true;
}
else if(object instanceof UserTable){
UserTable target = (UserTable)object;
return id == target.getId() && content.equals(target.getDes()) && selfId == Integer.valueOf(target.getUserId());
}
else if(object instanceof UserProtocol){
UserProtocol target = (UserProtocol)object;
return id == target.id && content.equals(target.content) && selfId == target.selfId;
}
else {
return false;
}
}
@Override
public String toString() {
return id+"-"+content+"-"+selfId;
}
}
复制代码
经过一个函数简单调用便可实现对象拷贝数据库
userTable = new UserTable(2019, "I am bast!", "2020");
UserProtocol userProtocol = new UserProtocol();
Convert.convert(userProtocol, userTable);
复制代码