`
QING____
  • 浏览: 2249830 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于Beanutils实现动态类与实例创建

    博客分类:
  • JAVA
 
阅读更多

    JAVA已经提供了在runtime期间动态创建“代理类”的机制,并且我们在实际开发工作中,特别是涉及到中间件开发的同学,经过会遇到“在runtime期间动态创建Class以及相应实例”的情况。比如调用者传递了“User”、“Order”等各种类型的对象,但是你的中间件程序需要对这些对象统一处理和封装,甚至需要在运行时为这些不同类型的instance“增加”property字段等。此时,我们可以用Apache Commons Beanutils来帮助我们解决相关问题。如下仅为代码示例:

    private Object buildDynaBean(Object parameterObject) throws Exception{
        Class clazz = parameterObject.getClass();
        PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(clazz);
        int length = pds.length;
        //在创建的动态类中,增加一些额外的property。此后下游的方法可以获取。
        DynaProperty[] dps = new DynaProperty[length + 2];//我们新增2个自定义的property
        for(int i=0;i < length;i++) {
            PropertyDescriptor pd = pds[i];
            DynaProperty dp = new DynaProperty(pd.getName(),pd.getPropertyType());
            dps[i] = dp;
        }
        //for router
        dps[length] =  new DynaProperty("callTime", Date.class);
        dps[length + 1] = new DynaProperty("counter",Integer.class);
        //你应该把clazz对应的DynaClass缓存起来,不必要每次都创建。
        DynaClass dynaClass = new BasicDynaClass(clazz + ".$Dyna", null, dps);

        DynaBean dynaBean = dynaClass.newInstance();
        BeanUtils.copyProperties(dynaBean, parameterObject);
        //初始化external属性值,你应该根据不同的类,设定不同的属性。
        dynaBean.set("callTime",new Date());
        dynaBean.set("counter",1);
        return dynaBean;
    }

 

分享到:
评论

相关推荐

    BeanUtils工具 .jar 包

    6. **国际化支持**:BeanUtils工具包可以与ResourceBundle结合使用,实现基于不同语言和地区的国际化(i18n)处理。 在"java学习笔记——javaweb之BeanUtils、EL、JSTL"这篇博客中,作者可能详细讲解了如何在Java Web...

    beanUtils包与源码

    例如,`copyProperties()`方法会创建一个`PropertyUtilsBean`实例,通过反射查找并调用目标Bean的setter方法来设置属性值。同时,它还处理了可能抛出的异常,如`IllegalAccessException`和`InvocationTarget...

    struts动态表单实例

    通过反射机制,BeanUtils能动态地识别和设置属性,支持动态表单的创建。 3. ** DynaActionForm**: 这是Struts中的动态表单类,相比于传统的ActionForm,DynaActionForm不需要预先定义字段。它的字段可以在运行时...

    BeanUtils包

    BeanUtils库是基于JavaBeans规范的,JavaBeans是一种符合特定规则的Java类,它们通常具有公有的getter和setter方法,用于封装和解封装对象的数据。 **BeanUtils的核心功能:** 1. **属性设置和获取:** BeanUtils...

    commons-beanutils-1.9.4

    - **对象复制**:在业务逻辑中,需要创建与原有对象属性相同的实例时,可以使用BeanUtils的复制功能。 - **属性操作**:当需要动态设置或获取JavaBean的属性时,BeanUtils可以大大减少代码量。 3. **集成与应用**...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见的已检查型异常 214 实例166 类未发现异常 ...

    通过反射机制实现动态表单

    总的来说,"通过反射机制实现动态表单"这个主题涵盖了Java编程中的一项高级技术,它涉及到类的元数据、对象的创建与操作,以及动态UI生成。通过理解和运用反射,开发者可以创建出更灵活、适应性强的软件系统。

    有关动态bean的一些用法

    3. 接着,通过DynaClass实例创建DynaBean对象。DynaBean就像一个空容器,等待我们填充属性值。 4. 最后,我们可以使用PropertyUtils.setProperty()或直接调用DynaBean的set()方法来设置属性值。设置完属性后,我们...

    commons-beanutils-1.8.3+commons-logging-1.1.1+itcast-tools-1.4.2

    1. **日志适配器**:允许开发者编写与特定日志实现无关的代码,如Log4j、Java内置的日志API(java.util.logging)或logback。 2. **易插拔**:只需更改配置,就可以轻松地切换不同的日志实现,使得应用程序的可维护...

    digester 实例

    通过digester,可以轻松地将XML配置文件的内容映射到这些Java对象,实现配置文件的动态加载和对象的自动创建。 总结起来,Apache Commons Digester是一个强大的工具,能够帮助Java开发者以声明式的方式处理XML到...

    封装了一个Hibernate增删改查的工具类

    本篇将详细介绍一个基于Hibernate封装的增删改查工具类,该工具类整合了util、comm.util以及beanutils等库,旨在提高开发效率,降低代码复杂度,方便开发者快速地获取session和sessionFactory。 首先,让我们理解...

    Jakarta+Commons中文介绍

    **IdentityMap** 类提供了一种基于对象引用而非哈希码的映射实现。 ##### LRUMap **LRUMap** 类提供了一种最近最少使用(Least Recently Used)策略的映射实现。 ##### MultiKeyMap **MultiKeyMap** 类提供了一...

    Java基础学习43.pdf

    反射的概述:Java反射机制是指在运行状态中,程序可以获取到关于类、接口、字段和方法的完整信息,并能动态地创建对象和调用其方法。这一机制最早由编程人员Smith在1982年提出。通过反射,开发者可以在不知道具体...

    spring 个人小结 源码分析机制原理

    本篇文章将基于标题"spring 个人小结 源码分析机制原理"及描述,深入探讨Spring的核心机制、源码分析以及创建Bean的过程。 首先,Spring的BeanUtils组件在处理Bean时,有一个重要的区别:Apache的BeanUtils支持`...

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

    具体实现中,可以使用`Class`类的`forName()`方法获取类对象,然后通过`newInstance()`创建实例。接着,通过`Field`类获取类的属性,并使用`setAccessible(true)`允许访问私有属性。最后,使用`set()`方法,结合`...

    实例讲解Java的Spring框架中的AOP实现

    实例中展示了如何在Spring中应用AOP,首先定义了一个`Sleepable`接口和其实现类`ChenLliNa`,然后创建了一个增强类`SleepHelper`,它实现了`MethodBeforeAdvice`和`AfterReturningAdvice`接口,分别表示前置通知和...

Global site tag (gtag.js) - Google Analytics