【问题标题】:BeanUtils with an addXX method带有 addXX 方法的 BeanUtils
【发布时间】:2009-08-25 04:34:57
【问题描述】:

我正在使用 Apache BeanUtils setProperty 方法以通用方式从 Excel 文件中导入数据。我为解析器提供“列名”和“属性名”对的列表,然后解析器使用 setProperty(...,“property name”,...) 为与“列名”匹配的 Excel 字段设置属性”。它工作得很好,但现在我遇到了一个问题,我有一个使用 addXXX() 方法设置的属性,我无法更改该类。 如何在不更改此类或解析器的情况下设置此属性? 可能吗? 我可以使用 DynaClass、PropertyUtils 或 MethodUtils 制作类似包装器的东西,以便在设置该属性时调用 addXX 方法吗?

谢谢!

【问题讨论】:

    标签: java javabeans apache-commons-beanutils


    【解决方案1】:

    您可以编写一个装饰器 bean 类,该类将包装您的类,并提供一个 setXXX() 方法委托给包装后的 bean 的 addXXX()。您甚至可以借助 cglib 或任何其他字节码检测库通过动态代理来做到这一点。

    如果您更愿意采用 DynaClass 方式,请查看 WrapDynaClass 作为起点。您必须扩展它以为您的方法提供自定义PropertyDescriptor。不过,我不会这样做,有两个原因 - 首先,addXXX() 语义可能与 setXXX() 完全不同;其次,整个 DynaClass/DynaBean 内部 API 有点乱,而编写自己的装饰器类非常简单。

    【讨论】:

    • 是的,为什么在简单的装饰器解决问题时使用 WrapDynaClass。谢谢!
    • 我创建了 docerator,但现在我在像以前一样创建实例时遇到了 java.lang.InstantiationException。有人知道为什么吗?
    • InstantiationException 当类是抽象类或接口或者它没有公共(或调用者可访问的)无参数构造函数时抛出。您的问题很可能是后者。
    • 我的问题是这个类是一个内部类,它需要是静态的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2012-06-06
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2014-02-24
    相关资源
    最近更新 更多