2009-08-25 9 views
1

Ich verwende die setProperty-Methode von Apache BeanUtils, um Daten aus einer Excel-Datei auf generische Weise zu importieren. Ich gebe dem Parser eine Liste von Paaren "Spaltenname" und "Eigenschaftsname", und dann legt der Parser die Eigenschaften mit setProperty (..., "Eigenschaftsname", ...) für die Excel-Felder fest, die mit "Spaltenname" übereinstimmen ". Es funktioniert gut, aber jetzt habe ich ein Problem, ich habe eine Eigenschaft, die mit einer addXXX() -Methode eingestellt ist, und ich kann diese Klasse nicht ändern. Wie kann ich diese Eigenschaft festlegen, ohne diese Klasse oder den Parser zu ändern? Ist es möglich? Kann ich mit DynaClass, PropertyUtils oder MethodUtils so etwas wie einen Wrapper erstellen, sodass beim Aufrufen dieser Eigenschaft die addXX-Methode aufgerufen wird?BeanUtils mit einer addXX-Methode

Danke!

Antwort

0

Sie können eine Decorator-Bean-Klasse schreiben, die Ihre Klasse umschließt und eine setXXX() -Methode bereitstellt, die delegiert, umXXX() der umschlossenen Bean hinzuzufügen. Sie können dies sogar über einen dynamischen Proxy mit Hilfe von cglib oder einer anderen Bytecode-Instrumentierungsbibliothek durchführen.

Wenn Sie lieber den DynaClass-Weg gehen, werfen Sie einen Blick auf WrapDynaClass als Ausgangspunkt. Sie müssen es erweitern, um benutzerdefinierte PropertyDescriptor für Ihre Methode bereitzustellen. Ich würde dies jedoch aus zwei Gründen nicht tun: Erstens ist die addXXX() - Semantik wahrscheinlich ziemlich verschieden von setXXX(); und zweitens ist die gesamte DynaClass/DynaBean-interne API etwas unordentlich, wohingegen das Schreiben Ihrer eigenen Dekorationsklasse sehr einfach ist.

+0

Ja, warum WrapDynaClass verwenden, wenn ein einfacher Decorator das Problem löst. Vielen Dank! – fmaste

+0

Ich habe den Dozerator erstellt, aber jetzt erhalte ich eine java.lang.InstantiationException, wenn ich die Instanz wie zuvor erstellt habe. Jemand weiß warum? – fmaste

+0

'InstantiationException' wird ausgelöst, wenn die Klasse entweder abstrakt oder eine Schnittstelle ist oder keinen Konstruktor hat, der öffentlich (oder anderweitig für Aufrufer zugänglich) ist. Dein Problem ist höchstwahrscheinlich letzteres. – ChssPly76

Verwandte Themen