【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。。> 但是,我现在搞的是模型绑定,不是编译器,其他的小众要求不支持也正常。
有了上面这些结果,模型的参数遍历,绑定,默认值等都可以轻而易举了。
- 【java学习】对java反射的学习及参数赋值的研究
- java重构学习6:移除对参数的赋值(Remove Assignments to Parameters)
- java反射的学习
- java 的反射学习
- java反射的学习
- java反射的学习
- java 反射的学习
- java反射的学习
- Java反射的学习
- java 反射的学习
- java 反射的学习。
- Java反射的学习
- (一)JAVA反射机制学习及研究
- 学习Java的反射机制
- JAVA反射机制的学习
- JAVA反射机制的学习
- JAVA反射机制的学习
- JAVA反射机制的学习
- C++第9周项目3 - 实现分数类中的运算符重载
- 神经网络算法的一个简单例子
- 13-5-3 ListView内容的截取全攻略
- 玩转微博营销葵花宝典
- 『MySQL』时间差
- 【java学习】对java反射的学习及参数赋值的研究
- FCKeditor总结
- linux网络编程:并发服务器的模型
- 手机支付宝密码存储机制分析
- javascript中必须使用var声明局部变量的情况
- hdu1698 Just a Hook(成段替换 lazy标记)
- Eclipse:invalid project description
- HDU1203(01背包)
- C++中Int转换成String