您的位置:首页 > 其它

reflect的一个使用的例子---------------自动赋值

2005-05-07 14:16 549 查看
现在java的web application一般都有数据库参与,
在修改和新增的时候,要保存字段,
如果让我们都公共来写这些的话,是比较麻烦的。
为什么不让程序来做?
怎么让程序来做?

Reflect提供实现方案。
第一,要做一配置文件,例如:
<auto-property>
<anto class="test.Person">
<operation name="create">
<property name="name" />
<property name="email" />
<property name="sex" />
<property name="address" />
</operation>

<operation name="modify">
<property name="email" />
<property name="sex" />
<property name="address" />
</operation>
.......
</auto>
</auto-property>
auto 标签标明需要自动赋值字段的类,operation指名要进行赋值的时机,property表示要进行赋值的字段。

第二,写reflect的实现。
这里主要是一个方法
public Object convert(Map params,Class clazz);
params:参数的名字和值
clazz:使用到的实体类的class
这里提供一个参考实现:
public Object convert(Map params,Class clazz,Set properties) throws Exception{

BeanInfo info = Introspector.getBeanInfo(clazz);
PropertyDescriptor [] ps = info.getPropertyDescriptors();

Object toReturn = clazz.newInstance();

for(int i=0;i<ps.length;i++){
PropertyDescriptor p = ps;
if(properties.contains(p.getName())){
//判断参数的类型
//8种原始类型
//和数种经常采用的类型(如 String java.sql.Date 等)
//这里为了简单说明问题,采用String类型
Object[]pvalue = new Object[1];
//假定需要的参数都能传入
pvalue[0] = params.get(p.getName());
p.getWriteMethod().invoke(toReturn,pvalue);
}
}
return toReturn;
}

该方法还不能直接使用---除非都是用String类型的,否则,应该对那些数据类型进行定义。

第三,解析xml配置文件,并调用实现。
使用之前,我们需要对该xml文件进行解析并缓存(缓存原因?每次都解析是不是很浪费?)。

一般,我们使用Servlet或action等,现在就拿servlet作说明。
HttpServletRequest可以获得所有参数和值,确保参数的字段和属性字段的一致性(这样做起来比较简单,代码量小)。
获得字段的列表后,使用reflect的实现的返回值并进行Cast,就直接能进行数据库操作了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: