mercredi 20 janvier 2010

java : ToStringBuilder et Reflexion

Voici, un petit exemple qui permet de faire une méthode ToString simplement et de manière générique :


/**
*
*/
package com.tools.config.properties.generic;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
* @author enwoo
*
*/
public class SimpleToStringBuilder {

/**
* cree une chaine toString de tout les valeurs des getters
* @param obj
* @return une chaine de cararctere
*/
@SuppressWarnings("unchecked")
public static String toString(Object obj) {

if(obj == null)
{
return "null";
}

StringBuilder builder = new StringBuilder();
builder.append(String.format("id obj = [%s]\n",obj.hashCode()));

Class cl = obj.getClass();

Method [] methods = cl.getDeclaredMethods();

// pour chacune des methodes
for (Method method : methods)
{
// test si c'est un getter
String nomDeMethode = method.getName();

if(Modifier.isPublic(method.getModifiers()) && nomDeMethode.matches("(get[A-Z0-9]+[a-zA-Z0-9]+)") && method.getParameterTypes().length == 0)
{
Field champ = obtenirLeChampAssocieAuGetter(cl, nomDeMethode);
String nomDuChamp = champ.getName();

try {
builder.append(String.format("[%s] => [%s]\n",nomDuChamp ,method.invoke(obj)));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
System.out.println(nomDeMethode);
}
}

return builder.toString();
}

/**
* @param cl
* @param nomDeMethode
* @return
*/
@SuppressWarnings("unchecked")
private static Field obtenirLeChampAssocieAuGetter(Class cl, String nomDeMethode) {
Field champ = null;
String nomDuChampAttendu = devineNomDuChamp(nomDeMethode);
try {
champ = cl.getDeclaredField(nomDuChampAttendu);
} catch (SecurityException e) {
System.err.println(String.format("Le getter nommme [%s] n'a pas de champ associe [%s]",nomDeMethode,nomDuChampAttendu));
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return champ;
}

/**
* transforme un nom de getter en nom du champ associe
* @param chaine
* @return
*/
private static String devineNomDuChamp(String nomDuGetter)
{
return nomDuGetter.substring(3,4).toLowerCase() + nomDuGetter.substring(4);
}
}



Voici un second exemple, utilisant des invocations de méthodes :


public static void fillBean(Object beanARemplir,Map parameters)
{
Method [] methods = beanARemplir.getClass().getMethods();

String nomAttribut;
String nomMethode;

for (Method method : methods) {

nomMethode = method.getName();

if(nomMethode.startsWith("set"))
{
// la methode est un setter
nomAttribut = nomMethode.substring(3).toLowerCase();

if(parameters.containsKey(nomAttribut))
{
try {
method.invoke(beanARemplir, parameters.get(nomAttribut));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

Aucun commentaire:

Enregistrer un commentaire