Java toString() à l'aide de 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.
- À partir de l'api du jdk "Le résultat doit être concis et informatif mais la représentation qui est facile pour une personne de lire." - une valeur générée automatiquement est un beau rapprochement, mais parfois vous avez juste à mordre la balle et écrire votre propre.
- Voir aussi Auto-générer de la Méthode toString
- double possible de java toString pour tout objet
- cette question est antérieure à cette question en deux ans. Aussi cette question est différente dans le sens où il n'est pas spécifiquement demandant de la réflexion.
- Correction de la, a raté son point de vue sur la réflexion. Je pense que c'est en fait un double de cette question.
Vous devez vous connecter pour publier un commentaire.
Apache commons-lang ReflectionToStringBuilder fait pour vous.
Une autre option, si vous êtes ok avec JSON, Google GSON bibliothèque.
Qu'il va faire la réflexion pour vous. Cela produit un son agréable, facile à lire fichier JSON. Facile à lire relatif, non les gens tech pourrait trouver le JSON intimidant.
Vous pouvez faire le GSONBuilder une variable de membre de trop, si vous ne voulez pas de nouvelles tout le temps.
Si vous avez des données qui ne peuvent pas être imprimés (comme un cours d'eau) ou des données que vous ne souhaitez pas imprimer, vous pouvez simplement ajouter @Exposer des balises pour les attributs que vous souhaitez imprimer puis d'utiliser la ligne suivante.
W/réflexion, que je n'avais pas été au courant de l'apache bibliothèque:
(sachez que si vous faites cela, vous aurez probablement besoin de traiter avec des sous-objets et assurez-vous qu'ils les imprimer correctement - en particulier, les tableaux ne vais pas vous montrer quelque chose d'utile)
Si vous utilisez Eclipse, vous pouvez également avoir un coup d'oeil à JUtils toString générateur, qui ne statiquement (la génération de la méthode dans votre code source).
Pas la réflexion, mais j'ai eu un coup d'oeil à la génération de la méthode toString (avec equals/hashCode) après l'étape de compilation à l'aide de manipulation de bytecode. Les résultats ont été mitigés.
Vous pouvez utiliser déjà mis en place des bibliothèques, comme ReflectionToStringBuilder de Apache commons-lang. Comme il a été mentionné.
Ou écrire smt similaire par vous-même avec API reflection.
Ici est quelques exemple:
Ici est Netbeans équivalent à Olivier de réponse; smart-codegen plugin pour Netbeans.