BeanUtils.copyProperties(source, targetObject)
将给定源bean的属性值复制到目标bean中,源类和目标类不必匹配,甚至不必派生,只要属性匹配即可
实践中使用案例
Entity对象与DTO对象相互转换
public SysUserDTO getByUsername(String username) {
SysUserEntity entity = baseDao.getByUsername(username);
return ConvertUtils.sourceToTarget(entity, SysUserDTO.class);
}
封装的ConvertUtils
/**
* 转换工具类
*/
public class ConvertUtils {
private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class);
public static <T> T sourceToTarget(Object source, Class<T> target){
if(source == null){
return null;
}
T targetObject = null;
try {
targetObject = target.newInstance();
BeanUtils.copyProperties(source, targetObject);
} catch (Exception e) {
logger.error("convert error ", e);
}
return targetObject;
}
public static <T> List<T> sourceToTarget(Collection<?> sourceList, Class<T> target){
if(sourceList == null){
return null;
}
List targetList = new ArrayList<>(sourceList.size());
try {
for(Object source : sourceList){
T targetObject = target.newInstance();
BeanUtils.copyProperties(source, targetObject);
targetList.add(targetObject);
}
}catch (Exception e){
logger.error("convert error ", e);
}
return targetList;
}
}
newInstance()
newInstance()方法和new关键字除了一个是方法一个是关键字外,最主要的区别是创建对象的方式不同。newInstance()使用类加载机制,new是创建一个新类;
newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造;
new: 强类型。相对高效。能调用任何public构造;
// 反射创建类的新实例对象
cName是包名;
Class aClass = Class.forName(cName);
T o = aClass.newInstance();
instanceof
instanceof 是 Java 中的一个双目运算符,由于它是由字母组成的,所以也是 Java 的保留关键字。在 Java 中可以使用 instanceof 关键字判断:
一个对象是否为一个类(或接口、抽象类、父类)的实例
,语法格式如下所示。
boolean result = obj instanceof Class
一个对象作为参数传入,只要满足obj instanceof Class
那么,这个参数只需要强制转化为父类,就可以执行父类的方法;
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}