用JAVA反射去构建一个对象吧!

比如想把 A (以下称modelWantToCast)的所有字段 赋值给B(以下称modelCastTo)
【需要字段名一样】

    public static <T> T castModelToAnotherModel(Object modelWantToCast, Class<T> modelCastToClazz) {
        if (modelWantToCast == null) {
            return null;
        }

        // 粗暴地获取A的所有方法
        Method[] dtoMethod = modelWantToCast.getClass().getDeclaredMethods();
        String getMethodName;

        T modelCastTo = null;

        try {
            // 实例化这个B
            modelCastTo = modelCastToClazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }

        for (Method getMethod : dtoMethod) {
            getMethodName = getMethod.getName();
            if (getMethodName.indexOf("get", 0) == -1) {
                continue;
            }
            ...... 代码在下面
        }

        return modelCastTo;
    }

1、之前经常用的很逗的方法
* 获取它的get set方法
* 从A中get出来
* 通过set方法set到A中去

            String setMethodName = "set" + getMethodName.substring(3, getMethodName.length());// 获取set方法名字

            Object value = null;// 取值

            try {
                value = getMethod.invoke(modelWantToCast);
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }

            Class parameterTypes = getMethod.getReturnType();// 取参数的类

            Method setMethod;

            try {
                // 获取set方法
                setMethod = modelCastToClazz.getDeclaredMethod(setMethodName, parameterTypes);
            } catch (NoSuchMethodException | SecurityException e) {
                continue;
            }

            try {
                // 粗暴地invoke进去
                setMethod.invoke(modelCastTo, value);
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }

2、后来发现还有更加粗暴的方法
* 获取对象它get方法
* 从A中get出来
* 从field直接set进去

            try {
                Object value = getMethod.invoke(modelWantToCast);// 取值
                if (value == null) {
                    continue;
                }
                String fileName = getFileNameFromGetterOrSetter(getMethodName); // 从get方法获取属性名
                Field field = modelCastToClazz.getDeclaredField(fileName);
                field.setAccessible(true);
                field.set(modelCastTo, value);// 直接塞进去
            } catch (NoSuchFieldException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }

猜你喜欢

转载自blog.csdn.net/anurnomeru/article/details/79621755