java源码修炼(三) getModel()

来源:互联网 发布:mysql 查询加分页 编辑:程序博客网 时间:2024/06/08 20:08
ClientaaaaQuery aaaaQuery = getModel(ClientaaaaQuery.class);


其实这个getModel()方法就是要得到类的实例,这个类ClientaaaQuery中的字段对应页面上的字段。这种方法和SpringMVC得到实体类一样。

贴一段代码:

public <T> T getModel(Class<T> modelClass) {        Field[] fields = getAllFields(modelClass);        T object;        try {            object = modelClass.newInstance();        } catch (Exception e) {            LOG.error("创建模型类实例失败!!!", e);            throw new RuntimeException(e);        }        String value;        StringBuilder pageParam = new StringBuilder();        boolean isQueryModel = ClassUtils.getAllInterfaces(modelClass).contains(IQueryModel.class);        Method method;        for (Field field : fields) {            int modifiers = field.getModifiers();            if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) {                continue;            }            value = getParameter(field.getName());            if (StringUtil.isEmpty(value)) {                if (field.getType() == String.class) {                    try {                        method = modelClass.getMethod("get" + firstCharUpper(field.getName()));                        Object invokeValue = method.invoke(object);                        if (invokeValue != null) {                            value = invokeValue.toString();                        }                    } catch (Exception e) {                        if (field.getType() == Boolean.class || field.getType() == boolean.class) {                            try {                                String fieldName = field.getName();                                method = modelClass.getMethod("get" + firstCharUpper(fieldName.startsWith("is") ? fieldName.replace("is", "") : fieldName));                                Object invokeValue = method.invoke(object);                                if (invokeValue != null) {                                    value = invokeValue.toString();                                }                            } catch (Exception e1) {                                LOG.warn(e1.getMessage());                            }                        } else {                            LOG.warn(e.getMessage());                        }                    }                }            }//            LOG.debug(field.getName() + " --> " + value);            if (StringUtil.isNotEmpty(value)) {                invokeMethod(modelClass, object, value, field.getName(), field.getType());            }            if (isQueryModel) {                if (null != field.getAnnotation(PagerParam.class)) {                    pageParam.append(genPageParam(field.getName(), value));                }            }        }        if (modelClass.getSuperclass() == PageModel.class) {            value = getParameter("pager.offset");            invokeMethod(modelClass, object, value, "offset", int.class);            if (isQueryModel) {                if (StringUtil.isEmpty(value)) {                    value = "0";                }                pageParam.append(genPageParam("pager.offset", value));                invokeMethod(modelClass, object, pageParam.toString(), "param", String.class);            }        }        return object;    }

其实就是使用了反射来得到的类以及用户填写的表单的数据

可以认为SpringMVC使用的也是这种方法

SPringMVC用的是HandlerMethodArgumentResolverHandlerMethodReturnValueHandler

这两个方法来获取用户填写表单的数据的