使用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