使用这个工具类即可实现,但是不灵活。我们可以进行封装,自定义一些规则。
import org.springframework.beans.BeanUtils;
BeanUtils.copyProperties(source, target);
比如自定义注解,忽略一些不需要赋值的字段。
为了方便,我使用了@JsonIgnore。
import com.fasterxml.jackson.annotation.JsonIgnore;
定义两个类
@Data
class AA {
public int a;
private Integer aa;
private double b;
@JsonIgnore
private Double bb;
@JsonIgnore
private String c;
public Date date;
}
@Data
class BB {
private int a;
private Integer aa;
private double b;
private Double bb;
private String c;
private Date date;
}
自定义工具类
public class TransformUtils {
public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException, NoSuchFieldException {
AA aa = new AA();
aa.setA(1);
aa.setAa(1);
aa.setC("name");
aa.setDate(new Date());
aa.setB(2);
aa.setBb((double) 2F);
BB to = (BB)to(aa, BB.class);
System.out.println(aa);
System.out.println(to);
}
public static Object to(Object source, Class<?> target) throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
// 获得类里面的所有属性 getFields只能获得公有属性
Field[] fields = source.getClass().getDeclaredFields(); // 获得全部属性 包括私有
List<String> list = new ArrayList<>(); // 存储需要忽略的字段名
for (Field field : fields) {
// 判断字段上面有没有该注解
if (field.isAnnotationPresent(JsonIgnore.class)) {
list.add(field.getName()); // 获得属性名
}
}
Constructor constructor = target.getDeclaredConstructor();
Object result = constructor.newInstance(); // 实例化Class<?>类型
BeanUtils.copyProperties(source, result, list.toArray(String[]::new));
return result;
}
}