`

利用反射实现JavaBean的自动赋值

    博客分类:
  • Java
阅读更多
在开发Web应用程序时,经常需要将Post的表单的内容传递给JavaBean。虽然一些框架可以自动完成这一动能,但是如果需要一些额外的灵活性,我们还是考虑自己来实现这一过程。

我们可以利用反射实现表单的字段自动赋给JavaBean的相应setXxx方法。为此,我们设计了一个ParameterUtil类,实现一个setFormBean()的静态方法:

package com.crackj2ee.web.util;

import java.lang.reflect.Method;
import java.util.*;

import javax.servlet.http.HttpServletRequest;
import com.sns.exception.ApplicationException;

public final class ParameterUtil {
  public static void setFormBean(HttpServletRequest request, Object bean) {
    Class c = bean.getClass();
    Method[] ms = c.getMethods();
    for(int i=0; i<ms.length; i++) {
        String name = ms.getName();
        if(name.startsWith("set")) {
          Class[] cc = ms.getParameterTypes();
          if(cc.length==1) {
            String type = cc[0].getName(); // parameter type
            try {
                // get property name:
                String prop = Character.toLowerCase(name.charAt(3)) + name.substring(4);
                // get parameter value:
                String param = getString(request, prop);
                if(param!=null && !param.equals("")) {
                  //ms.setAccessible(true);
                  if(type.equals("java.lang.String")) {
                    ms.invoke(bean, new Object[] {param});
                  }
                  else if(type.equals("int") || type.equals("java.lang.Integer")) {
                    ms.invoke(bean, new Object[] {new Integer(param)});
                  }
                  else if(type.equals("long") || type.equals("java.lang.Long")) {
                    ms.invoke(bean, new Object[] {new Long(param)});
                  }
                  else if(type.equals("boolean") || type.equals("java.lang.Boolean")) {
                    ms.invoke(bean, new Object[] { Boolean.valueOf(param) });
                  }
                  else if(type.equals("java.util.Date")) {
                    Date date = DateUtil.parseDateTime(param);
                    if(date!=null)
                        ms.invoke(bean, new Object[] {date});
                  }
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
          }
        }
    }
  }
}

每当发现JavaBean中的setXxx()方法时,便自动寻找表单的对应字段xxx,如果找到,就利用反射调用此方法,将对应的字段值赋给JavaBean。

由于表单传递的变量名和值全部是字符串,因此需要做某些转换。目前,该程序能处理的数据类型包括:boolean,Boolean,int,Integer,long,Long,Date,不被支持的数据类型被自动忽略。你也可以很方便地添加新的类型。

请注意,只有public的set方法能够被调用。如果你希望private或protected的set方法也能被调用,请将红色标识的getMethods()改为getDeclaredMethods(),以便获得包括private和protected在内的所有方法,并将ms.setAccessible(true);的注释去掉,以便能正确调用private和protected方法。

反射是Java语言非常强大的功能,但是由于反射会破坏对象封装,并且反射调用的速度较慢,因此,只能在必要的工具类中使用。
分享到:
评论

相关推荐

    利用反射实现JavaBean 的自动赋值

    ### 利用反射实现JavaBean的自动赋值 在软件开发过程中,特别是在Web应用程序的开发中,经常会遇到需要将表单提交的数据绑定到JavaBean对象上的需求。这可以通过多种方式实现,例如使用Spring MVC等框架的自动绑定...

    javabean基础知识

    2. **参数封装**:当表单提交后,可以通过JavaBean自动接收并保存表单数据。这通常是通过JSP内置的`request`对象来实现的,使用`request.getParameter()`方法获取表单字段的值,并将其设置到JavaBean的相应属性中。 ...

    使用反射自动装填前台数据和struts自动装填很像

    反射的自动装填前台数据,通常指的是在接收前端数据后,利用反射API动态调用对象的setter方法,将接收到的数据设置到对象的属性中。 具体实现中,可以使用`Class`类的`forName()`方法获取类对象,然后通过`new...

    javabeanbeanutils

    3. **反射操作**:BeanUtils库利用Java的反射机制,能够在运行时动态地调用JavaBean的getter和setter方法,增强了代码的灵活性。 4. **处理集合**:对于集合类型的属性,BeanUtils可以方便地进行迭代和批量操作,如...

    java bean 与 Web Form表单如何实现自动装配

    例如,Struts2的`ActionSupport`类提供了一些方便的方法,如`createFormBean()`和`fillFormBeanProperties()`,这些方法利用工具类如`HttpHelper`来实现自动装配的功能。`createFormBean()`根据表单字段名称创建并...

    commons-beanutils-1.8.3.jar

    这些方法通过反射机制自动处理了JavaBean的getter和setter方法,极大地减少了代码量。 2. **类型转换**:在处理不同类型的数据时,BeanUtils能够自动进行类型转换。例如,当尝试将字符串赋值给整型或浮点型属性时,...

    Java基础_第二阶段-day18每日作业卷1

    - **反射操作**:它利用Java的反射机制,自动寻找JavaBean的属性并进行操作。 - **简化代码**:避免了繁琐的属性赋值过程,提高了代码的可读性和简洁性。 2. **使用BeanUtils工具包的操作步骤**: - **导入依赖*...

    commons-beanutils-1.8.0

    2. **反射操作(Reflection Utilities)**:BeanUtils库利用Java的反射API,能够动态地获取和设置JavaBean的属性。这意味着开发者无需预先知道对象的具体属性,只需要属性名称就能完成操作。 3. **类型转换(Type ...

    beanutils-logging.zip

    3. **类型转换**:BeanUtils还提供了自动类型转换的功能,当赋值的类型与属性类型不匹配时,它会尝试进行转换。 接下来,我们转向“commons-logging-1.1.1.jar”。Apache Commons Logging是另一个常用的Java日志库...

    commons-beanutils

    4. **类型转换**:BeanUtils还提供了自动类型转换的功能,当赋值的类型与属性类型不一致时,会尝试进行转换。 **三、源码分析** `commons-beanutils-1.8.3`版本包含了完整的源代码,这对于开发者来说是一份宝贵的...

    commons-beanutils-1.8.3-sources.jar

    例如,在Web开发中,它可以将HTTP请求参数自动绑定到JavaBean,减少手动赋值的工作;在数据持久化中,它可以帮助将数据库查询结果轻松转换为业务对象;在对象拷贝时,它的`copyProperties()`方法能有效地提高效率。 ...

    beanutils源码

    深入研究BeanUtils的源码,不仅可以帮助我们理解如何更有效地操作JavaBeans,还能学习到如何利用反射和设计模式来构建灵活、可维护的Java代码。此外,对于那些想要深入了解Java核心特性的开发者,这是一个很好的学习...

    commons-beanutils-1.9.2下载

    4. **反射支持**:BeanUtils利用Java的反射API,动态地处理JavaBean对象,无需预先知道对象的具体结构。 5. **处理集合**:对于包含集合的属性,BeanUtils可以自动处理,例如将数组或列表赋值给一个集合属性。 6. ...

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

    Java开发技术大全 电子版

    9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取成员方法信息295 9.6.3获取构造方法信息296 9.6.4获取类的成员属性297 9.6.5根据方法的名称来执行方法299 9.6.6创建新的...

    Java经典面试题+答案(带书签)pdf

    - **实现**:一个类可以实现一个接口,从而获得接口中声明的方法。 **3. 抽象关键字为什么不能和private、static、final共存** - **抽象方法**不能是`private`或`static`,因为这些方法无法被子类覆盖。 - 抽象...

    经典的问题

    - **实现**: 接口的实现,实现类需要提供接口中声明的所有方法的具体实现。 **3. 抽象关键字为什么不能和private、static、final共存** - `abstract`修饰的类或方法不能被声明为`private`、`static`或`final`,...

    教学实施大纲(javaWEB方向)

    - **使用String对表单验证**:利用String类的方法检查输入的有效性。 - **使用正则表达式对表单验证**:正则表达式提供了一种强大的模式匹配方式。 #### 五、Oracle数据库 **1. Oracle安装及数据库和表的创建** -...

    Struts2+Spring+Hibernate知识点总结

    - **支持多种模型实现**:模型层可以采用JavaBean、EJB的EntityBean等多种技术实现。 - **强大的框架支持**:提供了丰富的标记库和类库,如ActionServlet、Action、ActionForm等,大大提升了开发效率。 #### ...

Global site tag (gtag.js) - Google Analytics