【java】递归遍历获取模型所有参数及复杂模型下面所有参数

【前言】

假如大家有做过模型绑定或者代码生成的父子表之类的话,那么,如何获得整个模型的树形结构将会是大家遇到的一个问题,

这里我直接用遍历及递归方式来获取---当然,每次接收到一个类都遍历及递归一次效率十分低,可以加一个缓存什么的来提高效率。

package CodeGen.BetterModel.Core;

import CodeGen.JavaDataType;
import CodeGen.Utils.JAVA.*;
import CodeGen.Utils.Annotations.*;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 13-5-14
 * Time: 上午10:28
 * To change this template use File | Settings | File Templates.
 */
public class FormFactory {


    public FormModel model2FormInfo(Class clazz){
        FormModel formInfo=new FormModel();
        String modelClassName=clazz.getName();
        formInfo.ClassPath=modelClassName;
        if(modelClassName.lastIndexOf('.')!=-1&&modelClassName.lastIndexOf('.')+1<modelClassName.length()){
            formInfo.className=modelClassName.substring(modelClassName.lastIndexOf('.')+1);
        }
        else{
            formInfo.className=modelClassName;
        }

        formInfo.formID="form1";
        formInfo.formName_ZH="表单";
        /*
        * 判断是否枚举,假如是的话,就不要傻傻递归了,无限循环。
        * */
        if(clazz.isEnum()){

            ArrayList<FormParameter> plist=  getEnumFormParameters(clazz);
            for (FormParameter fi: plist){
                formInfo.paralist.add(fi);

            }
            return  formInfo;
        }








        //--开始用反射了。
        try{
         Annotation ano_form=  clazz.getAnnotation(Form.class);
         if(ano_form!=null){
             Form ano_tmp=(Form)ano_form;
            // formInfo.className=  ano_tmp.name();
             formInfo.formName_ZH=ano_tmp.name_ZH();
             formInfo.formID=ano_tmp.formID();
         }
            //--接下来获取所有参数

            Field[]  fields=clazz.getFields();
            if(fields!=null){
                for (Field tfiled:fields){
                    /*判断是否enum,假如是enum,那么就注意了,不要出现无限循环,需要额外处理*/
                    Class SuperClazz=  tfiled.getClass().getSuperclass();
                    if(SuperClazz!=null){
                      String t3=   tfiled.getClass().getName();
                   String t1=   SuperClazz.getName();
                        String t2="";

                    }
                    FormParameter formParameter=recuision_getParameter(tfiled);
                    //--递归遍历相关参数
                     formInfo.paralist.add(formParameter);
                }

            }
        }
        catch (Exception e){}



        return  formInfo;
    }

    private  ArrayList<FormParameter> getEnumFormParameters(Class clazz){
     ArrayList<FormParameter> paralist=new ArrayList<FormParameter>();
        Class c=clazz;

                    try {
                        Object[] objs = c.getEnumConstants();

                        ArrayList<String> _enumValueList=new ArrayList<String>();
                        for (Object objs1: objs){
                        String valueName1=objs1.toString().trim();
                            if(valueName1.contains(".")||valueName1.contains("[")||valueName1.contains("@")){}
                            else{
                                _enumValueList.add(valueName1);
                            }

                        }

                        for (String str_key: _enumValueList){

                            FormParameter fparameter=new FormParameter();
                            fparameter.parameterName=str_key;
                            fparameter.objectType= JavaDataType.INTEGER;
                            paralist.add(fparameter);

                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

        return  paralist;

    }

    private FormParameter recuision_getParameter(Field field){
        FormParameter formParameter=new FormParameter();
        String tt1=  field.getName();
        
        formParameter.parameterMeta=ParameterHelper.getParameterMeta(field);
        formParameter.displayType=UI.Text;
        formParameter.parameterName=field.getName();
        formParameter.name_ZH=field.getName();
        /*当前display参数*/
        //--判断display 注解
        Annotation antemp1= field.getAnnotation(Display.class);
        if(antemp1!=null){
            Display d_ano=(Display)antemp1;

            formParameter.displayType=d_ano.ui();
            formParameter.name_ZH=d_ano.name();
            formParameter.defaultValue=d_ano.defaultValue();

            /***********************************************************************/

        }
        /*字段是否枚举类型。是的话就不要遍历了,直接获取下面几个值*/
        if(field.isEnumConstant()){
            ArrayList<FormParameter> plist=getEnumFormParameters(field.getClass());
            for (FormParameter fp:plist){
                formParameter.childList.add(fp);
            }

            return formParameter;
        }
        //--默认值
        if(formParameter.parameterMeta.getBaseType()==JavaBaseType.baseType_boolean||formParameter.parameterMeta.getObjectType()==JavaObjectType.ObjectType_Boolean){
            formParameter.defaultValue="false";
        }


        //--获取参数默认的默认规则
        ValidateInput v_para_default=getValidateInputByParaMeta(formParameter.parameterMeta,formParameter.name_ZH);
        if(v_para_default!=null){
            if(formParameter.validatelist.containsKey(v_para_default.getRuleName())){
                formParameter.validatelist.remove(v_para_default.getRuleName());
            }
            formParameter.validatelist.put(v_para_default.getRuleName(),v_para_default);
        }
        //--获取当前UI的默认规则
        ValidateInput v_ui_rule=getValidateInputByHtmlUI(formParameter.displayType,formParameter.name_ZH);
        if(v_ui_rule!=null){
            if(formParameter.validatelist.containsKey(v_ui_rule.getRuleName())){
                formParameter.validatelist.remove(v_ui_rule.getRuleName());
            }
            formParameter.validatelist.put(v_ui_rule.getRuleName(),v_ui_rule);
        }
        //--获取当前参数所有附着的规则。
        ArrayList<ValidateInput> arrList=getValidateList(field);
        if(arrList!=null||arrList.size()>0){

            for(ValidateInput vrule:arrList){
                if(formParameter.validatelist.containsKey(vrule.getRuleName())){
                    formParameter.validatelist.remove(vrule.getRuleName());
                }
                formParameter.validatelist.put(vrule.getRuleName(),vrule);
            }

        }
        //--获取所有附着的extUI规则
         ArrayList<ExtUI> extList=getExtUIlistByField(field);
         if(extList.size()>0){
             for (ExtUI eui:extList){

                 formParameter.extuiList.put(eui.getExtUIname(),eui);

             }

         }
        /*
        * 判断是否复杂类型,是否需要递归来获取树形结构
        * */
        if(formParameter.parameterMeta!=null&&formParameter.parameterMeta.isCustomObjectType==true){
            try{
                Class TmpClazz=Class.forName(formParameter.parameterMeta.classPath);

                formParameter.childList=new ArrayList<FormParameter>();

                Field[] childFileds=TmpClazz.getFields();
                if(childFileds!=null){
                    for (Field ttField: childFileds){
                        FormParameter para2=recuision_getParameter(ttField);
                        if(para2!=null){
                            formParameter.childList.add(para2);
                        }

                    }
                }

            }
            catch (Exception e){
                e.printStackTrace();
            }
        }



        return  formParameter;
    }
     /**
     * 获取一个参数的所有附着验证规则
     * **/
    private ArrayList<ValidateInput> getValidateList(Field tField){
        ArrayList<ValidateInput> arrList=new ArrayList<ValidateInput>();
        //--判断验证规则
        //--自定义正则表达式
       ValidateRuleType ruletypename=new ValidateRuleType();
       Annotation antemp1=tField.getAnnotation(Validate_CustomRegex.class);
        if(antemp1!=null){
            Validate_CustomRegex c_ano=(Validate_CustomRegex)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_CustomRegex);
            vi.setErrorMessage(c_ano.ErrorMessage());
            vi.set("regex",c_ano.Value());

            arrList.add(vi);
        }
        //--是否布尔值
        antemp1=tField.getAnnotation(Validate_isBoolean.class);
        if(antemp1!=null){
            Validate_isBoolean c_ano=(Validate_isBoolean)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isBoolean);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否颜色
        antemp1=tField.getAnnotation(Validate_isColor.class);
        if(antemp1!=null){
            Validate_isColor c_ano=(Validate_isColor)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isColor);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否日期
        antemp1=tField.getAnnotation(Validate_isDateTime.class);
        if(antemp1!=null){
            Validate_isDateTime c_ano=(Validate_isDateTime)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isDateTime);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否Email地址
        antemp1=tField.getAnnotation(Validate_isEmailAddr.class);
        if(antemp1!=null){
            Validate_isEmailAddr c_ano=(Validate_isEmailAddr)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isEmailAddr);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否整数
        antemp1=tField.getAnnotation(Validate_isInteger.class);
        if(antemp1!=null){
            Validate_isInteger c_ano=(Validate_isInteger)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isInteger);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否Numberic
        antemp1=tField.getAnnotation(Validate_isNumberic.class);
        if(antemp1!=null){
            Validate_isNumberic c_ano=(Validate_isNumberic)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isNumberic);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否电话号码
        antemp1=tField.getAnnotation(Validate_isPhoneNumber.class);
        if(antemp1!=null){
            Validate_isPhoneNumber c_ano=(Validate_isPhoneNumber)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isPhoneNumber);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }

        //--是否必须
        antemp1=tField.getAnnotation(Validate_isRequired.class);
        if(antemp1!=null){
            Validate_isRequired c_ano=(Validate_isRequired)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isRequired);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }
        //--是否网址
        antemp1=tField.getAnnotation(Validate_isURL.class);
        if(antemp1!=null){
            Validate_isURL c_ano=(Validate_isURL)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_isURL);
            vi.setErrorMessage(c_ano.ErrorMessage());
            //vi.set("regex",c_ano.Value());
            arrList.add(vi);
        }

        //--数字范围
        antemp1=tField.getAnnotation(Validate_NumberRange.class);
        if(antemp1!=null){
            Validate_NumberRange c_ano=(Validate_NumberRange)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_NumberRange);
            vi.setErrorMessage(c_ano.ErrorMessage());
            vi.set("min",c_ano.min());
            vi.set("max",c_ano.max());
            arrList.add(vi);
        }
        //--字符串范围
        antemp1=tField.getAnnotation(Validate_StringRange.class);
        if(antemp1!=null){
            Validate_StringRange c_ano=(Validate_StringRange)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_StringRange);
            vi.setErrorMessage(c_ano.ErrorMessage());
            vi.set("minLen",c_ano.minLen());
            vi.set("maxLen",c_ano.maxLen());
            arrList.add(vi);
        }

        //--是否对其他参数进行比较
        antemp1=tField.getAnnotation(Validate_CompareTo.class);
        if(antemp1!=null){
            Validate_CompareTo c_ano=(Validate_CompareTo)antemp1;
            ValidateInput vi=new ValidateInput();
            vi.setRuleName(ruletypename.rule_CompareTo);
            vi.setErrorMessage(c_ano.ErrorMessage());
            vi.set("list", c_ano.list());
            arrList.add(vi);  }

        return  arrList;

    }

    private ArrayList<ExtUI> getExtUIlistByField(Field tField){
        ArrayList<ExtUI> extlist=new ArrayList<ExtUI>();
        ExtUItype exttype=new ExtUItype();
            /*ExtUI额外UI类型*/
        //--是否显示密码强度
       Annotation antemp1=tField.getAnnotation(ExtUI_passwordStrength.class);
        if(antemp1!=null){
            ExtUI_passwordStrength c_ano=(ExtUI_passwordStrength)antemp1;
            ExtUI extInfo=new ExtUI();
            extInfo.setExtUIname(exttype.getExtUI_passwordStrength());

          extlist.add(extInfo);
        }
        antemp1=tField.getAnnotation(ExtUI_TitleList.class);
        if(antemp1!=null){
            ExtUI_TitleList c_ano=(ExtUI_TitleList)antemp1;
            ExtUI extInfo=new ExtUI();
            extInfo.setExtUIname(exttype.getExtUI_TitleList());
            extInfo.set("titleField",c_ano.titleField());
            extInfo.set("keyField",c_ano.keyField());

            extlist.add(extInfo);
        }
        antemp1=tField.getAnnotation(ExtUI_AlbumsList.class);
        if(antemp1!=null){
            ExtUI_AlbumsList c_ano=(ExtUI_AlbumsList)antemp1;
            ExtUI extInfo=new ExtUI();
            extInfo.setExtUIname(exttype.getExtUI_AlbumsList());
            extInfo.set("imgField",c_ano.imgField());
            extInfo.set("titleField",c_ano.titleField());
            extInfo.set("keyField",c_ano.keyField());
            extlist.add(extInfo);
        }


        return extlist;
    }

    private  ValidateInput getValidateInputByParaMeta(ParameterMeta pMeta,String name_ZH){
        if(pMeta==null){
            return  null;
        }
        ValidateRuleType _vtype=new ValidateRuleType();
        if(pMeta.baseType== JavaBaseType.baseType_int||pMeta.baseType==JavaBaseType.baseType_short||pMeta.baseType==JavaBaseType.baseType_long||pMeta.objectType== JavaObjectType.ObjectType_Integer||pMeta.objectType==JavaObjectType.ObjectType_Short||pMeta.objectType==JavaObjectType.ObjectType_Long){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(""+name_ZH+"必须为整数!");
            v.setRuleName(_vtype.getRule_isInteger());
            return v;
        }
        if(pMeta.baseType==JavaBaseType.baseType_float||pMeta.baseType==JavaBaseType.baseType_double||pMeta.objectType==JavaObjectType.ObjectType_Float||pMeta.objectType==JavaObjectType.ObjectType_Double){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(""+name_ZH+"必须为小数!");
            v.setRuleName(_vtype.getRule_isNumberic());
            return v;
        }

        if(pMeta.objectType==JavaObjectType.ObjectType_Date){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(""+name_ZH+"必须为日期!");
            v.setRuleName(_vtype.getRule_isDateTime());
            return v;
        }

        return null;


    }

    private  ValidateInput getValidateInputByHtmlUI(UI ui,String name_ZH){

        ValidateRuleType vtype=new ValidateRuleType();
        if(ui==UI.ColorPicker){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(name_ZH+"颜色只能由字母及数字组成。");
            v.setRuleName(vtype.getRule_isColor());
            return v;
        }
        if(ui==UI.Checkbox||ui==UI.Radio){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(name_ZH+"必须为布尔值。");
            v.setRuleName(vtype.getRule_isBoolean());
            return v;
        }
        if(ui==UI.DateTimePicker){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(name_ZH+"必须为日期(格式:2012-02-12)。");
            v.setRuleName(vtype.getRule_isDateTime());
            return v;
        }
        if(ui==UI.Email){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(name_ZH+"必须为邮箱格式(例如:xxx@qq.com)");
            v.setRuleName(vtype.getRule_isEmailAddr());
            return v;
        }
        if(ui==UI.AttachFile||ui==UI.AttachImage){
            ValidateInput v=new ValidateInput();
            v.setErrorMessage(name_ZH+"网址格式错误。");
            v.setRuleName(vtype.getRule_isURL());
            return v;
        }
        return null;


    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值