lundi 3 mai 2010

java : reflexion et type primitif

Voici, comment faire de la reflexion avec des type primitif et remplir un JavaBean. Ce petit code peut montre comment appeler un setter qui prend en paramètre un boolean.

A noter :
1) qu'il faut définir le type de paramètres avec le type primitif :

Class[] params = { boolean.class };


2) Puis, lors de lm'appel il faut passer un tableau d'objet pour l'appel à invoke() ... Donc, on passe un tableau de Boolean (ou Integer, etc ...):

Object [] params = {new Boolean(true)};
...
remplirBean(beanARemplir, nomDuChamp, params);


et voilou, c'est magique ...



public static void main(String[] args)
{
Object [] params = {new Boolean(true)};
PtuResultatsBoutonBean beanARemplir = new PtuResultatsBoutonBean();
String nomDuChamp = "repTraitementEnabled";
remplirBean(beanARemplir, nomDuChamp, params);
System.out.println(beanARemplir);
}

private static void remplirBean(PtuResultatsBoutonBean beanARemplir, String nomDuChamp, Object [] valeur) {
Class cl = beanARemplir.getClass();
Class[] params = { boolean.class };
// pour chacune des methodes
String nomSetterAttendu = "set" + nomDuChamp.substring(0, 1).toUpperCase() + nomDuChamp.substring(1, nomDuChamp.length());

// msg erreur
String msg = null;
try {
Method method = cl.getMethod(nomSetterAttendu, params);

// on a trouve le setter et on verifie qu'il est public, que son nom commence par set, et qu'il prend un parametre
if (method != null && Modifier.isPublic(method.getModifiers()) && method.getName().matches("(set[A-Z0-9]+[a-zA-Z0-9]*)")
&& method.getParameterTypes().length == 1) {
method.invoke(beanARemplir, valeur);
}

} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}

Aucun commentaire:

Enregistrer un commentaire