简化繁琐的赋值——反射在Jdbc和Struts中的应用
本文的目的是让已经学习过Java反射机制的读者或者没有学习过Java反射机制的读者看一个Java反射机制在实际中应用的例子;对于没有学习过Java反射机制的读者来说,通过本文,知道Java反射机制在实际中是怎么应用的,增加读者学习Java反射机制的热情,从而进一步深入的学习Java反射机制;对于已经学习过Java反射机制的读者来说,可以通过本文,看看Java反射机制在实际中是怎么应用的,进一步深入的理解Java反射,这一点我深有体会,我在学习了Java反射后的很长一段时间内,没有深入的理解它,进而不知道怎么在实际中用到它。
如果读者想深入的学习Java反射机制,可以参考本文所列的参考文章学习,这些文章都是我在学习Java反射机制的时候用过的,可以说是有一定的代表性。
一句话来说,这里所要陈述的Java反射机制,都是在本文中所要用到的Java反射机制。读者在看到本文的问题的解决思路时,不妨将实际问题的解决方法和我即将陈述的Java反射机制结合起来看,以增加对Java反射机制的理解。
好,闲话少说,让我们来看一看本文所要用到的Java反射机制:
1.取得对象的Class对象
每一个对象都有一个getClass()方法,可以取得该对象的Class对象。如取得对象o的Class对象的代码如下:
Class c = o.getClass();
2.对象的属性
Java反射机制可以挖掘对象本身的元数据,比如,对象的父类、对象的属性、对象的方法等等。这里我们来看看Java反射机制是怎么来取得对象的属性的。
有了对象的Class对象,我们就可以用getDeclaredFields()方法来取得该对象所有的属性;我们也可以通过某一个属性的属性名来取得该属性,方法为:getDeclaredField(String fieldName)。如,我们想取得o对象里的一个name属性,代码如下:
Class c = o.getClass();
Field f = c.getDeclaredField(“name”);
有了属性对象,我们可以进一步获取该属性的信息。如属性的作用域,属性的类型等等。我们来看一下怎么取得属性的类型,代码如下:
Class t = f.getType();
这样,我们可以获得属性类型名:
String typeName = t.getName();
3. 取得对象的方法
上面取得了对象的属性,同样我们也可以取得对象的方法和该方法的元数据,如该方法的作用域、输入参数、返回值类型等等。
getDeclaredMethod(String functionName,Class[] types)
该方法有两个输入参数,第一个是functionName,我们一看就知道是我们需要获取的方法的方法名;第二个参数types是一个Class类型的数组对象,是我们需要获取的方法的输入参数的类型所组成的Class数组。
如,我们想取得o对象的public String func(String s, Hashtable ht)这样一个方法。
首先我们知道该方法的方法名为:“func”
下面我们来构造getDeclaredMethod方法的第二个输入参数:
Class ptypes[] = new Class[2];
ptypes[0] = Class.forName("java.lang.String");
ptypes[1] = Class.forName("java.util.Hashtable");
这样,我们就可以取得该方法了:
Method m = c.getMethod("func",ptypes);
4.运行期内调用对象的方法
可以说,运行期内调用对象的方法是Java反射机制的核心所在。
这里所说的运行期内调用对象的方法,包括运行期内调用类的构造器,即在运行期内生成类的实例,这在实际的应用中也是十分有用的Java反射机制。但在本文中的例子由于没有使用到,因此不再陈述,有兴趣的读者可以到本文后面的参考文献中去学习。
这里重点说一说在运行期内调用对象的普通方法
invoke(Object o,Object[] args)
该方法也有两个输入参数:一个是Object对象,就是我们需要在运行期内调用的方法所在的对象,如上面一直提到的o对象;第二个参数是一个由Object对象组成的数组,是指我们需要在运行期内调用的方法的实际输入参数。
如果输入参数为”Hello,World!”和null,我们想调用o对象的public String func(String s, Hashtable ht)这样一个方法,常规的调用方式为:
String s = o.func(“Hello,World!”,null);
我们应用Java的反射机制在运行期内的调用方式为:
Object args[] = new Object[2];
arg[0] = new String("Hello,world");
arg[1] = null;
Object r = m.invoke(obj, arg);
String s = (String)r;
其中,对象m已经通过前面的Java反射机制获取。
到这里,在本文中要用到的Java反射机制就已经全部陈述了一遍。可以看到,本文真正要用到的关于Java反射机制的知识点并不是很多,但Java反射机制这样的一个牛刀小试,就让我们的代码优化了很多,可见Java反射机制的确是魅力无穷。
问题的解决
我们先看例一的问题的处理过程:
通过前面的分析,可以得出,我们需要这样一个公用的方法:在这个方法里头,我们可以提供的输入参数为:
一. Stmt,用来取得table中字段的值。
二. 在数据库table中,我们要取得的字段的位置,如例一中是从1到23,我们可以构造一个int型的数组:int[] ports = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
三. Javabean的对象,在例一为:general
四. 一个Javabean的属性名所组成数组,跟前面的字段位置一一对应。在例一中为:String[] propNames = new String[]{“bom_id”,”colorway_number”,” color_number”,”colorway_type_id”,”print_id”,”print_name”,”print_type_id”,”print_repeat_type_id”,”print_repeat_height”,”print_repeat_height_uom_id”,”print_repeat_width”,”print_repeat_width_uom_id”,”print_status_id”,”yarn_dye_id”,”yarn_dye_name”,”yarn_wrap_color_number”,”yarn_weft_color_number”,”yarn_repeat_height”,”yarn_repeat_height_uom_id”,”yarn_repeat_width”,”yarn_repeat_width_uom_id”,”yarn_status_id”,”print_process_id”};可以看出,这些属性名都是Javabean的setXXX()方法对应的属性的名称。
有了上面的四个输入参数,我们希望调用了这样一个公用的方法,stmt中的字段的值就会赋到Javabean中相应的属性中去。
可以确定需要构造如下的一个公用的方法:
public static void StmtToBean(String[] propNames,Object o,int[] ports, oracle.jdbc.OracleCallableStatement stmt)
在这个方法里,我们首先要做一个循环;在循环体内,我们先从stmt中取出值来;再赋给Javabean对象o。
我们来看一下实际的代码:
public static void StmtToBean(String[] propNames,Object o,int[] ports, OracleCallableStatement stmt) throws ValueManagerException
{
推荐文章 |
