java 用户自定义的父类转换成子类的方法

来源:互联网 发布:淘宝店代理品牌怎么做 编辑:程序博客网 时间:2024/06/06 03:20

        在工作中,一般是实体类对应的数据库表,另外再定义一个Model继承实体类,在model里往往添加一些辅助的属性。我们从数据库查出的数据放在实体类里,但是展现数据时需要用到model类,这时就需要把实体类转换成Model类。父类不可能强制转换成子类,所以写了一个通用的方法,适用于这种场景下的转换,代码如下:

    /**     * 通过public的 get set方法进行复制,适合用于父类转换成子类     * @param objSource     * @param clazzSrc     * @param clazzDes     * @return     * @throws InstantiationException     * @throws IllegalAccessException     * @throws IllegalArgumentException     * @throws InvocationTargetException     */    public static <T, K> T copyByMethod(K objSource,Class<K> clazzSrc,Class<T> clazzDes ) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {                  if(null == objSource) return null;//如果源对象为空,则直接返回null                    T objDes = clazzDes.newInstance();                    return mergeByPublicMethod(objSource, objDes, clazzSrc, clazzDes);                } public static <T, K> T mergeByPublicMethod(K objSource,T objDes,Class<K> clazzSrc,Class<T> clazzDes) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{                    if(null == objSource) return null;//如果源对象为空,则直接返回null            //获取目标对象的所有属性          Method[] methodDeses = clazzDes.getMethods();          Map<String,Method> m = new HashMap<String, Method>();          // 循环遍历方法,获取set方法            for ( Method method : methodDeses )            {               //如果不是set方法则跳过              if(!method.getName().startsWith("set")) continue;            m.put(method.getName().substring(3), method);                    }                              // 获得源对象所有方法         Method[] sourceMethods = clazzSrc.getMethods();          // 循环遍方法            for ( Method method : sourceMethods )            {                //如果是set方法则跳过            if(!method.getName().startsWith("get")) continue;            //如果目标对象不存在该方法,则跳过              if(!m.containsKey(method.getName().substring(3))) continue;                          m.get(method.getName().substring(3)).invoke(objDes, method.invoke(objSource));                     }            return objDes;     }