The day after Black Friday and most folks are still at the WalMart so I'll take
a stab at some testcases
private E createElementByConstructor() {
try {
Constructor<E>[] constrArray = (Constructor<E>[])
elementClass
.getConstructors();
Constructor<E> constructor = null;
Class[] paramTypes = null;
for (Constructor<E> constr : constrArray) {
if (constructor == null) {
/*this is executed first which is fine */
constructor = constr;
paramTypes = constr.getParameterTypes();
/*constr ParameterType (Class) count (e.g. 0) is less than number of Classes
stored in local var paramTypes (e.g. 1) */
} else if (constr.getParameterTypes().length <
paramTypes.length) {
constructor = constr;
paramTypes = constr.getParameterTypes();
}
}/* Testcase execution 1st pass Class is Class1 with 1
parameter named fu*/
Class=Class1 parameter=fu
Constructor is now Class1(fu)
paramTypes.length is now 1
/* Testcase execution 2nd pass Class is Class2 with 0 parameters*/
Class=Class2 0 parameters so
constr.getParameterTypes().length()==0 < paramTypes 1
Constructor is now Class2();
paramTypes.length is now 0
/* Testcase execution 3rd pass Class is Class2 with 2 parameters parameter=fu
and parameter=bar */
Class3 parameter fu, parameter bar so
constr.getParameterTypes().length()==2 < paramTypes 0 FAILS!!!!
assignments to variables of constructor and paramTypes are bypassed
Constructor is STILL Class2();
paramTypes.length is STILL 0
is this what you intend?
Martin
______________________________________________
Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité
Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger
sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung
oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht dient lediglich dem
Austausch von Informationen und entfaltet keine rechtliche Bindungswirkung.
Aufgrund der leichten Manipulierbarkeit von E-Mails koennen wir keine Haftung
fuer den Inhalt uebernehmen.
Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le
destinataire prévu, nous te demandons avec bonté que pour satisfaire informez
l'expéditeur. N'importe quelle diffusion non autorisée ou la copie de ceci est
interdite. Ce message sert à l'information seulement et n'aura pas n'importe
quel effet légalement obligatoire. Étant donné que les email peuvent facilement
être sujets à la manipulation, nous ne pouvons accepter aucune responsabilité
pour le contenu fourni.
> Date: Sat, 27 Nov 2010 18:26:11 +0900
> Subject: Re: javax.servlet.ServletException: BeanUtils.populate
> From: [email protected]
> To: [email protected]
>
> I have dug it out from my old project.
>
> The code is not very beautiful, you can modify it if you wish,
> but please don't change the author information.
>
> Here is the code:
>
> ========================================
>
> package com.ewsoft.common.utils;
>
> import java.lang.reflect.Constructor;
> import java.util.ArrayList;
> import java.util.List;
>
> /**
> * A List class which can create items as need.<br />
> * When method get(index) and add(index, element) is called,<br />
> * and if there is no item in this index, item instances will be created
> * automatically to avoid a NullPointerException.
> *
> * @author Li Ying([email protected])
> */
> public class AutoList<E extends Object> extends ArrayList<E> {
> private Class<E> elementClass;
>
> public AutoList(final Class<E> elementClass) {
> super();
> this.elementClass = elementClass;
> }
>
> private void ensureSize(final int size) {
> synchronized (this) {
> while (this.size() < size) {
> add(createNewElement());
> }
> }
> }
>
> private E createElementByConstructor() {
> try {
> Constructor<E>[] constrArray = (Constructor<E>[])
> elementClass
> .getConstructors();
>
> Constructor<E> constructor = null;
> Class[] paramTypes = null;
>
> for (Constructor<E> constr : constrArray) {
> if (constructor == null) {
> constructor = constr;
> paramTypes = constr.getParameterTypes();
> } else if (constr.getParameterTypes().length <
> paramTypes.length) {
> constructor = constr;
> paramTypes = constr.getParameterTypes();
> }
> }
>
> List paramList = new ArrayList();
> for (int i = 0; i < paramTypes.length; i++) {
> paramList.add(null);
> }
>
> return constructor.newInstance(paramList.toArray());
> } catch (Exception e) {
> return null;
> }
> }
>
> private E createNewElement() {
> return createElementByConstructor();
> }
>
> /*
> * (non-Javadoc)
> *
> * @see java.util.ArrayList#get(int)
> */
> @Override
> public final E get(final int index) {
> ensureSize(index + 1);
>
> return super.get(index);
> }
>
> /*
> * (non-Javadoc)
> *
> * @see java.util.ArrayList#add(int, java.lang.Object)
> */
> @Override
> public final void add(final int index, final E element) {
> ensureSize(index);
>
> super.add(index, element);
> }
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>