54 votes

Java toString () utilisant la réflexion?

J'ai écrit un toString() d'une classe en Java, l'autre jour, par l'écriture manuelle de chaque élément de la classe à une Chaîne et il m'est apparu que l'utilisation de la réflexion, il pourrait être possible de créer un générique de la méthode toString() qui pourrait fonctionner sur TOUTES les classes. I. E. il serait de trouver les noms de champ et les valeurs et de les envoyer à une Chaîne.

Obtenir les noms de champ est assez simple, voici ce qu'un co-travailleur venu avec:

public static List initFieldArray(String className) throws ClassNotFoundException {

    Class c = Class.forName(className);
    Field field[] = c.getFields();
    List<String> classFields = new ArrayList(field.length);

    for (int i = 0; i < field.length; i++) {
        String cf = field[i].toString();
        classFields.add(cf.substring(cf.lastIndexOf(".") + 1));
    }

    return classFields;
}

À l'aide d'une usine, j'ai pu réduire la surcharge des performances en stockant les champs de la première fois où les méthodes toString() est appelée. Cependant, de trouver des valeurs qui pourrait être beaucoup plus cher.

En raison de la performance de la réflexion, ce qui peut être plus hypothétique puis pratique. Mais je suis intéressé par l'idée de la réflexion et de la façon dont je peux l'utiliser pour améliorer mon quotidien de programmation.

98voto

krosenvold Points 35979

Apache commons-lang ReflectionToStringBuilder le fait pour vous.

 import org.apache.commons.lang3.builder.ReflectionToStringBuilder

// your code goes here

public String toString() {
   return ReflectionToStringBuilder.toString(this);
}
 

6voto

Steve B. Points 23227

W / réflexion, comme je ne connaissais pas la bibliothèque Apache:

(sachez que si vous faites cela, vous devrez probablement gérer les sous-objets et vous assurer qu'ils s'impriment correctement - en particulier, les tableaux ne vous montreront rien d'utile)

 @Override
public String toString()
{
	StringBuilder b = new StringBuilder("[");
	for (Field f : getClass().getFields())
	{
		if (!isStaticField(f))
		{
			try
			{
				b.append(f.getName() + "=" + f.get(this) + " ");
			} catch (IllegalAccessException e)
			{
				// pass, don't print
			}
		}
	}
	b.append(']');
	return b.toString();
}


private boolean isStaticField(Field f)
{
	return Modifier.isStatic(f.getModifiers());
}
 

5voto

Olivier Points 978

Si vous utilisez Eclipse, vous pouvez également jeter un œil au générateur JUtils toString , qui le fait de manière statique (en générant la méthode dans votre code source).

4voto

McDowell Points 62645

Pas de réflexion, mais j’ai envisagé de générer la méthode toString (avec equals / hashCode) en tant qu’étape de post-compilation à l’aide de la manipulation par code intermédiaire. Les résultats ont été mitigés.

2voto

James McMahon Points 14356

Voici l'équivalent Netbeans de la réponse d'Olivier; plugin smart-codegen pour Netbeans .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X