/**
*
*/
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