【java学习】对java反射的学习及参数赋值的研究

来源:互联网 发布:ubuntu 复制 编辑:程序博客网 时间:2024/05/29 15:03

今日,需要尝试搞一个mvc框架(当然用java,为什么是java?因为在学java)。里面需要实现模型绑定及模型验证,需要用到反射(需要用到反射的地方很多,很担心反射会成为瓶颈),现在来熟悉一下反射的用法及参数如何赋值。


首先,需要解析一下,java里面的基础类型有:

int 普通整型float 浮点型char 字符型short 短整型byte 字节型long 长整型double 双精度
几个,但是,这几个基础类型无法直接用在 List<>,ArrayList<>,Vector<>,LinkedList<>上面,他们各自对应一个类型:
Integer
Float
Char
Short
Byte
Long
Double
这个类型跟基础类型可以自动转换(java1.5以后)也可以用在List上面。
String不是基础数据类型。
看了这个以后,我们来编写一下咱们在码代码时候经常写的参数及类型,然后看看如何里面的类型如何,如何自动赋值上去。
【一个普通的userInfo类】
package EWeb.eForm;public class accountInfo {    public String AccountName;}
【一个普通的测试所有基础类型及复合类型的类】
package EWeb.eForm;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Vector;public class testAllParas {    //--字符串类别    public String singleStr;    public String[] normalArrStr;    public List<String> listArrStr;    public ArrayList<String> arraylistStr;    public LinkedList<String> linkedlistStr;    public Vector<String> vectorStr;     //--整数类型    public int singleInt;    public int[] normalArrInt;    public Integer singleInteger;    public Integer[] normalArrInteger;    public List<Integer> listArrInt;    public ArrayList<Integer> arraylistInt;    public LinkedList<Integer> linkedlistInt;    public Vector<Integer> vectorInt;    //--float类型    public float singlefloat;    public Float singleFloat;    public Float[] normalArrFloat;    public float[] normalArrfloat;    public List<Float> listArrFloat;    public ArrayList<Float> arraylistFloat;    public LinkedList<Float> linkedlistFloat;    public Vector<Float> vectorFloat;    //--double类型    public double singledouble;    public double[] normalArrdouble;    public Double singleDouble;    public Double[] normalArrDouble;    public List<Double> listArrDouble;    public ArrayList<Double> arraylistDouble;    public LinkedList<Double> linkedlistDouble;    public Vector<Double> vectorDouble;    //--char类型    public char singlechar;    public char[] normalArrchar;    public Character singlecharacter;    public Character[] normalArrcharacter;    public List<Character> listArrcharacter;    public ArrayList<Character> arraylistcharacter;    public LinkedList<Character> linkedlistcharacter;    public Vector<Character> vectorcharacter;    //--Short类型    public short singleshort;    public short[] normalArrshort;    public Short singleShort;    public Short[] normalArrShort;    public List<Short> listArrShort;    public ArrayList<Short> arraylistShort;    public LinkedList<Short> linkedlistShort;    public Vector<Short> vectorShort;    //--byte类型    public byte singlebyte;    public byte[] normalArrbyte;    public Byte singleByte;    public Byte[] normalArrByte;    public List<Byte> listArrByte;    public ArrayList<Byte> arraylistByte;    public LinkedList<Byte> linkedlistBbyte;    public Vector<Byte> vectorByte;    //--Long类型    public long singlelong;    public long[] normalArrlong;    public Long singleLong;    public Long[] normalArrLong;    public List<Long> listArrLong;    public ArrayList<Long> arraylistlong;    public LinkedList<Long> linkedlistLong;    public Vector<Long> vectorLong;    //--布尔类型类型    public boolean singleboolean;    public boolean[] normalArrboolean;    public Boolean singleBoolean;    public Boolean[] normalArrBoolean;    public List<Boolean> listArrBoolean;    public ArrayList<Boolean> arraylistBoolean;    public LinkedList<Boolean> linkedlistBoolean;    public Vector<Boolean> vectorBoolean;     //--自定义类型    public accountInfo singleaccountInfo;    public accountInfo[] normalArraccountInfo;    public List<accountInfo> listArraccountInfo;    public ArrayList<accountInfo> arraylistaccountInfo;    public LinkedList<accountInfo> linkedlistaccountInfo;    public Vector<accountInfo> vectoraccountInfo;        }

ok,我们编写一个方法来测试一下上面这些类型的type是如何的。
【一个测试类】
package Easis.Test;import java.lang.reflect.Method;import java.lang.reflect.Field;public class TestTheModel {    public  static void main(String[] args){    // Reflect_Object(null,"EWeb.eForm.userInfo");        Reflect_Parameter(null,"EWeb.eForm.testAllParas");    }    public static  void iterator_show_parameter(){    }    ///--遍历method    public static void Reflect_Object(Object o,String classPath){        try {            Class userClass = Class.forName(classPath);//加载类            Method[] methods = userClass.getDeclaredMethods();//获得类的方法集合            //遍历方法集合            for(int i =0 ;i<methods.length;i++){                //获取所有getXX()的返回值                //methods[i].getName()方法返回方法名                String MethodName=methods[i].getName();                System.out.println("方法名称为:"+MethodName);                //if(methods[i].getName().startsWith("get")){                  //  Object object = methods[i].invoke(o, null);                    //System.out.println(" "+methods[i].getName()+"="+object);                //}            }            System.out.println("====遍历方法完毕====");        } catch (Exception e) {            e.printStackTrace();        }    }     public static  String LpadString(String originStr,int size){         StringBuilder sb1=new StringBuilder();         if(originStr.length()<size){             int totalPad=size-originStr.length();             for (int i=0;i<totalPad;i++){                 sb1.append(" ");             }         }         return  originStr+sb1.toString();     }    ///--遍历参数    public static void Reflect_Parameter(Object o,String classPath){        try {            Class userClass = Class.forName(classPath);//加载类            Method[] methods = userClass.getDeclaredMethods();//获得类的方法集合            Field[] paraFields= userClass.getFields();            for (Field f1:paraFields){                String fName=  f1.getName();                System.out.print(LpadString("参数名称为:" + fName,25));                System.out.print("getGenericType():" + f1.getGenericType().toString());              //  System.out.print("  f1.getClass()内容为:"+  f1.getClass());               // System.out.print("  f1.getType()内容为:"+  f1.getType());                System.out.println("");            }            //遍历方法集合            for(int i =0 ;i<methods.length;i++){                //获取所有getXX()的返回值                //methods[i].getName()方法返回方法名                String MethodName=methods[i].getName();                System.out.println("方法名称为:"+MethodName);                //if(methods[i].getName().startsWith("get")){                //  Object object = methods[i].invoke(o, null);                //System.out.println(" "+methods[i].getName()+"="+object);                //}            }            System.out.println("====遍历方法完毕====");        } catch (Exception e) {            e.printStackTrace();        }    }}

【运行之后,让我们来看看结果】
参数名称为:singleStr          getGenericType():class java.lang.String参数名称为:normalArrStr       getGenericType():class [Ljava.lang.String;参数名称为:listArrStr         getGenericType():java.util.List<java.lang.String>参数名称为:arraylistStr       getGenericType():java.util.ArrayList<java.lang.String>参数名称为:linkedlistStr      getGenericType():java.util.LinkedList<java.lang.String>参数名称为:vectorStr          getGenericType():java.util.Vector<java.lang.String>参数名称为:singleInt          getGenericType():int参数名称为:normalArrInt       getGenericType():class [I参数名称为:singleInteger      getGenericType():class java.lang.Integer参数名称为:normalArrInteger   getGenericType():class [Ljava.lang.Integer;参数名称为:listArrInt         getGenericType():java.util.List<java.lang.Integer>参数名称为:arraylistInt       getGenericType():java.util.ArrayList<java.lang.Integer>参数名称为:linkedlistInt      getGenericType():java.util.LinkedList<java.lang.Integer>参数名称为:vectorInt          getGenericType():java.util.Vector<java.lang.Integer>参数名称为:singlefloat        getGenericType():float参数名称为:singleFloat        getGenericType():class java.lang.Float参数名称为:normalArrFloat     getGenericType():class [Ljava.lang.Float;参数名称为:normalArrfloat     getGenericType():class [F参数名称为:listArrFloat       getGenericType():java.util.List<java.lang.Float>参数名称为:arraylistFloat     getGenericType():java.util.ArrayList<java.lang.Float>参数名称为:linkedlistFloat    getGenericType():java.util.LinkedList<java.lang.Float>参数名称为:vectorFloat        getGenericType():java.util.Vector<java.lang.Float>参数名称为:singledouble       getGenericType():double参数名称为:normalArrdouble    getGenericType():class [D参数名称为:singleDouble       getGenericType():class java.lang.Double参数名称为:normalArrDouble    getGenericType():class [Ljava.lang.Double;参数名称为:listArrDouble      getGenericType():java.util.List<java.lang.Double>参数名称为:arraylistDouble    getGenericType():java.util.ArrayList<java.lang.Double>参数名称为:linkedlistDouble   getGenericType():java.util.LinkedList<java.lang.Double>参数名称为:vectorDouble       getGenericType():java.util.Vector<java.lang.Double>参数名称为:singlechar         getGenericType():char参数名称为:normalArrchar      getGenericType():class [C参数名称为:singlecharacter    getGenericType():class java.lang.Character参数名称为:normalArrcharacter getGenericType():class [Ljava.lang.Character;参数名称为:listArrcharacter   getGenericType():java.util.List<java.lang.Character>参数名称为:arraylistcharacter getGenericType():java.util.ArrayList<java.lang.Character>参数名称为:linkedlistcharactergetGenericType():java.util.LinkedList<java.lang.Character>参数名称为:vectorcharacter    getGenericType():java.util.Vector<java.lang.Character>参数名称为:singleshort        getGenericType():short参数名称为:normalArrshort     getGenericType():class [S参数名称为:singleShort        getGenericType():class java.lang.Short参数名称为:normalArrShort     getGenericType():class [Ljava.lang.Short;参数名称为:listArrShort       getGenericType():java.util.List<java.lang.Short>参数名称为:arraylistShort     getGenericType():java.util.ArrayList<java.lang.Short>参数名称为:linkedlistShort    getGenericType():java.util.LinkedList<java.lang.Short>参数名称为:vectorShort        getGenericType():java.util.Vector<java.lang.Short>参数名称为:singlebyte         getGenericType():byte参数名称为:normalArrbyte      getGenericType():class [B参数名称为:singleByte         getGenericType():class java.lang.Byte参数名称为:normalArrByte      getGenericType():class [Ljava.lang.Byte;参数名称为:listArrByte        getGenericType():java.util.List<java.lang.Byte>参数名称为:arraylistByte      getGenericType():java.util.ArrayList<java.lang.Byte>参数名称为:linkedlistBbyte    getGenericType():java.util.LinkedList<java.lang.Byte>参数名称为:vectorByte         getGenericType():java.util.Vector<java.lang.Byte>参数名称为:singlelong         getGenericType():long参数名称为:normalArrlong      getGenericType():class [J参数名称为:singleLong         getGenericType():class java.lang.Long参数名称为:normalArrLong      getGenericType():class [Ljava.lang.Long;参数名称为:listArrLong        getGenericType():java.util.List<java.lang.Long>参数名称为:arraylistlong      getGenericType():java.util.ArrayList<java.lang.Long>参数名称为:linkedlistLong     getGenericType():java.util.LinkedList<java.lang.Long>参数名称为:vectorLong         getGenericType():java.util.Vector<java.lang.Long>参数名称为:singleboolean      getGenericType():boolean参数名称为:normalArrboolean   getGenericType():class [Z参数名称为:singleBoolean      getGenericType():class java.lang.Boolean参数名称为:normalArrBoolean   getGenericType():class [Ljava.lang.Boolean;参数名称为:listArrBoolean     getGenericType():java.util.List<java.lang.Boolean>参数名称为:arraylistBoolean   getGenericType():java.util.ArrayList<java.lang.Boolean>参数名称为:linkedlistBoolean  getGenericType():java.util.LinkedList<java.lang.Boolean>参数名称为:vectorBoolean      getGenericType():java.util.Vector<java.lang.Boolean>参数名称为:singleuserInfo     getGenericType():class EWeb.eForm.userInfo参数名称为:normalArruserInfo  getGenericType():class [LEWeb.eForm.userInfo;参数名称为:listArruserInfo    getGenericType():java.util.List<EWeb.eForm.userInfo>参数名称为:arraylistuserInfo  getGenericType():java.util.ArrayList<EWeb.eForm.userInfo>参数名称为:linkedlistuserInfo getGenericType():java.util.LinkedList<EWeb.eForm.userInfo>参数名称为:vectoruserInfo     getGenericType():java.util.Vector<EWeb.eForm.userInfo>====遍历方法完毕====

【结论】

根据上面的测试,我们可以认定,对于常用的参数(鉴于绝大部分人写模型的时候都不会超出上面上面范围之内---复合类型需要递归遍历),模型类只有三种形式:

1、int byte char 等等 直接显示基础类型的形式;

2、class xx.xxx.xx 等单独一个类的形式;

3、class [J 等基础数据类型的数组形式及 class [xx.xx.xx;等自定义类型或内置类型数组形式;

4、xxx.xxx.xx<xx.xx.xx> 等某个类型后面加一个泛型;

5、除了这些,当然还可以有其他类型,譬如:xx.xx.xx<数据类型1,数据类型2。。> 但是,我现在搞的是模型绑定,不是编译器,其他的小众要求不支持也正常。


有了上面这些结果,模型的参数遍历,绑定,默认值等都可以轻而易举了。

原创粉丝点击