BeanUtils使用

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);
}

你可能感兴趣的:(java,java,beanUtils)