网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

简化繁琐的赋值——反射在Jdbc和Struts中的应用

http://www.diybl.com/ 2007-2-6  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

本文的目的是让已经学习过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







         {

文章整理:DIY部落 http://www.diybl.com (本站)   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言

 

最新新闻