2009-08-25 3 views
1

Я использую метод setProperty Apache BeanUtils для импорта данных из файла Excel в общем виде. Я предоставляю синтаксическому анализатору список пар «имя colum name» и «имя свойства», а затем парсер устанавливает свойства с помощью setProperty (..., «имя свойства», ...) для полей Excel, которые соответствуют «имени столбца» ». Он работает хорошо, но теперь у меня проблема, у меня есть свойство, которое настроено с помощью метода addXXX(), и я не могу изменить этот класс. Как установить это свойство без изменения этого класса или анализатора? Возможно ли это? Могу ли я сделать что-то вроде обертки с DynaClass, PropertyUtils или MethodUtils, поэтому, устанавливая это свойство, он вызывает метод addXX?BeanUtils с методом addXX

Спасибо!

ответ

0

Вы можете написать класс компонента декоратора, который будет обернут вокруг вашего класса и предоставить метод setXXX(), делегирующий addXXX() завернутого компонента. Вы даже можете сделать это через динамический прокси с помощью cglib или любой другой библиотеки инструментов байт-кода.

Если вы предпочитаете путь DynaClass, взгляните на WrapDynaClass в качестве отправной точки. Вам нужно будет расширить его, чтобы предоставить свой метод PropertyDescriptor. Я бы этого не сделал, по двум причинам: во-первых, семантика addXXX(), скорее всего, отличается от setXXX(); и во-вторых, весь внутренний API DynaClass/DynaBean является немного беспорядочным, тогда как писать собственный класс декоратора очень просто.

+0

Да, зачем использовать WrapDynaClass, когда простой декоратор решает проблему. Благодаря! – fmaste

+0

Я сделал docerator, но теперь я получаю исключение java.lang.InstantiationException при создании экземпляра, как раньше. Кто-нибудь знает почему? – fmaste

+0

'InstantiationException' вызывается, когда класс является абстрактным или интерфейсом или у него нет публичного (или иначе доступного для вызывающего) конструктора без аргументов. Ваша проблема, скорее всего, последняя. – ChssPly76