2 votes

Comment obtenir un hachage de la structure d'une classe Java ?

Imaginons que j'ai les deux classes suivantes :

public class A {
    private String field1;
    private B field2;
}

public class B {
    private String field3;
}

Ce que je veux faire, c'est utiliser Java Reflection pour obtenir tous les champs et tous les sous-champs de la classe A et créer un hachage à partir de ceux-ci. Dans cet exemple, j'obtiendrais, disons, une liste de chaînes de caractères disant ["field1", "field2", "field3"] et je hacherais la liste entière.

Si cela peut vous aider, la raison pour laquelle je fais cela est que j'ai une collection de MongoDB pour A . Cependant, de temps en temps, j'ajoute de nouveaux champs à la base de données. A o B Je dois donc rafraîchir l'ensemble de la collection avec les nouveaux champs lorsque cela se produit. Pour cela, je dois garder la trace, dans une collection séparée, de ce que j'ai déjà rafraîchi ou non. A pour sa structure actuelle. Le plus simple serait de hacher les noms de ses champs et sous-champs.

2voto

Freiheit Points 2694

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/reflect/FieldUtils.html#getAllFieldsList-java.lang.Class- semble pouvoir être une solution suffisante à votre problème.

Répondre à un commentaire, getAllFieldsList renvoie à List<Field> donc vous devriez être en mesure d'itérer ou de récurer à travers cette List et ensuite appeler Field.getType() qui renvoie Class . Maintenant, appelez getAllFieldsList à nouveau. Cela devrait vous permettre de traverser la classe A puis d'obtenir des informations sur la classe B.

Une autre idée pourrait être d'utiliser le JSON_STYLE et d'appeler https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html#ReflectionToStringBuilder-java.lang.Object-org.apache.commons.lang3.builder.ToStringStyle- . Ceci va récurer et imprimer le JSON représentant A vous pouvez alors analyser le JSON et vérifier les noms des champs.

Une autre solution pourrait être de gérer cela au moment de la compilation ou au moment de la création du paquet. À moins que vous n'utilisiez d'autres techniques de réflexion ou de programmation orientée aspect, vos classes ne changeront qu'au moment de la compilation. La détection des modifications dans le cadre de vos processus de construction ou de CI/CD, puis l'introduction de ces modifications dans votre MongoDB peuvent être plus judicieuses.

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