今日,需要尝试搞一个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。。> 但是,我现在搞的是模型绑定,不是编译器,其他的小众要求不支持也正常。
有了上面这些结果,模型的参数遍历,绑定,默认值等都可以轻而易举了。