使用Java Reflection技术实现ActionForm数据装载

使用java反射不同与常规的java编程,java反射载入的特殊类型原数据是JVM中类与对象的描述。反射对于框架编写者来说,是一个非常强大的工具,它可以为我们创建灵活的代码。我们熟知的Struts、Spring、Hibernate等框架在处理配置文件中的bean时,基本都使用了java反射技术。

因为介绍java反射技术和Java Reflection APIs的文章已经相当多了,就不想浪费笔墨了,想详细了解请参考侯捷先生的《Java反射机制》一文。

下边我就写一段JavaPassion.net开源组织扩展Struts的一段代码,这个想法说实话并不全是我的,主要是前些日子在Jdon上闲逛,发现了一篇帖子说了这样一个问题,主要是想实现一个ActionForm数据的动态装载(我是这样理解的),就是把数据库中的数据装载到ActionForm中。在未提供持久层数据向表示层数据的动态装载的情况下,自我感觉实现这个东西多少还是有一定价值的,特别是使用Struts的logic tag进行大量数据呈现时。下面我就把代码段列出,再进行说明:

ArrayList paraList = new ArrayList();

String recordValue = "";

Object obj = null;

ResultSetMetaData rsmd = rs.getMetaData();

int colCount = rsmd.getColumnCount();

while (rs.next()) {

     obj = Class.forName(actionform).newInstance();

     for (int i = 1; i <= colCount; i++) {

         if (null != rs.getString(rsmd.getColumnName(i)))

              recordValue = rs.getString(rsmd.getColumnName(i));

         else

              recordValue = "";

         Method method = obj.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)), new Class[]{recordValue.getClass()});

         method.invoke(obj, new Object[]{recordValue});

     }

     paraList.add(obj);

}

return paraList;

这里我已经把Exception的处理省略掉了,为了看起来更加方便一些。这个方法需要接收两个参数,一个是java.sql.ResultSet,一个是java.lang.String。分别用来存储通过JDBC获取的记录集和ActionForm的全部名称(即包名+类名)。首先用ResultSet对象实例了一个ResultSetMetaData对象,即记录集原数据对象,主要是用它来获取列名。在进行记录集循环时,使用列名来识别setter访问器的方法名,也就是说,数据库表中的列名需要与ActionForm中的属性名相同。

先说明一下java.lang.reflect.Method类,它主要用来提供类或者接口中的单独某个方法(以及如何访问该方法)的信息,它所反映的方法可能是类方法或者实例方法(包括抽象的方法)。

通过ActionForm对象的getMethod()方法返回Method的实例,第一个参数是通过数据表中的列名指定的setter访问器名称,第二个参数是参数列表及其类型。之后通过Method实例的invoke()方法装载基础方法对象和用于方法调用的参数。最后把已经装载好的对象放入java.util.ArrayList对象中,并反还该对象。这样就可以使用Struts的相关logic tag把其中的值循环输出了。

欢迎交流:  E-Mail: javapassion@126.com
                   MSN: javapassion@hotmail.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值