BeanHelper.javaorg.apache.commons.lang3.ArrayUtils — Concaténation de tableaux pour la collecte de champs/méthodes dans la hiérarchie de classesorg.apache.commons.lang3.StringUtils — Manipulation de chaînes (capitalize, uncapitalize, split)java.lang.annotation.Annotation — Découverte d'annotations sur les champsjava.lang.reflect.* — API de réflexion Java de base : Field, Method, Constructor, Modifier, Array, InvocationTargetExceptionjava.util.* — Collections, itérateurs, tables de hachage pour la mise en cacheorg.slf4j.Logger — Journalisation des erreurs pour les échecs de réflexionBeanHelper utilise cinq caches synchronisés statiques pour éviter les appels de réflexion répétés, qui sont coûteux en Java. Ceci est critique pour les pages de listes Wicket où BeanHelper est appelé pour chaque cellule d'un tableau de données triable.
| Cache | Clé | Valeur | Bénéfice |
|---|---|---|---|
declaredFieldsCache | Class | Field[] | Évite de re-parcourir la hiérarchie de classes pour les champs |
declaredMethodsCache | Class | Method[] | Évite de re-parcourir la hiérarchie de classes pour les méthodes |
declaredFieldAnnotationsCache | "classe:nomchamp" | Annotation[] | Évite de re-résoudre les champs annotés (critique pour le tri des colonnes Wicket) |
getterMethodsCache | "classe:nomchamp" | Method | Évite de re-chercher les méthodes getter |
declaredGetterMethodsCache | String | Method[] | Déclaré mais semble inutilisé dans le code fourni — peut être peuplé ailleurs |
determinePropertyName(Method) — Supprime le préfixe get/set/is/has et met en minuscule le premier caractèredetermineGetter(Class, nomchamp, onlyPublicGetter) — Trouve la méthode getter (getX(), isX() pour les booléens, hasX() pour les booléens), gère les méthodes pont (ne retourne pas les méthodes synthétiques de pont)determineSetter(Class, nomchamp) — Trouve le setter avec un seul paramètredeterminePropertyType(Class, nomchamp) — Obtient le type de retour du getter (type de la propriété)getDeclaredAnnotations(Class, nomchamp) prend en charge les chemins de propriétés imbriqués (séparés par des points, ex. "adresse.ville.nom") en parcourant la chaîne de champs par réflexion pour trouver les annotations du champ terminal. Ceci est essentiel pour les tableaux de données Wicket qui affichent les propriétés d'objets imbriqués avec des colonnes triables.
getProperty(Object, String) — Invoque le getter sur un beansetProperty(Object, String, Object) — Invoque le settergetIndexedProperty(Object, "prop[3]") — Prend en charge l'accès indexé aux collections/tableauxgetNestedProperty(Object, "a.b.c") — Parcourt un chemin de propriétés séparé par des points, gérant les nulls avec élégance (retourne null si un intermédiaire est null)Copie les propriétés spécifiées de l'objet source vers l'objet de destination, retournant true si une propriété a effectivement changé. Prend en charge :
Arrays.equals()Objects.equals() (sûr pour les nulls)getAllDeclaredFields(Class) — Retourne tous les champs, y compris ceux hérités, en parcourant la chaîne des superclassesgetAllDeclaredMethods(Class) — Retourne toutes les méthodes, y compris celles héritéesgetDeclaredPropertyFields(Class) — Retourne uniquement les champs non transitoires, non statiques, non finaux (propriétés persistantes réelles)getFieldValue(Object, Class/String, nomchamp) — Lit la valeur d'un champ via la réflexion (setAccessible pour les champs privés)newInstance(Class, ...) — Plusieurs surcharges pour la construction réflexive d'objets avec diverses signatures de constructeursinvoke(Object, Method, args) — Invocation générique de méthode avec gestion des erreursLe drapeau TEST_MODE (contrôlé par enterTestMode()/exitTestMode()) supprime la journalisation des erreurs pendant l'exécution des tests. Cela permet aux tests de tenter des opérations de réflexion qui sont censées échouer sans polluer les journaux de test avec des traces de pile. Les méthodes logInstantiationException() respectent ce drapeau.
determineGetter() ignore les méthodes pont (méthodes synthétiques créées par le compilateur pour l'effacement de type générique) pour retourner la méthode réellement implémentéegetNestedProperty() retourne null à tout point de la chaîne où une valeur intermédiaire est null, plutôt que de lever une NPEnewInstance() appelle constructor.setAccessible(true) pour instancier des classes avec des constructeurs privéscommons-beanutils dans la construction Gradle, BeanHelper implémente sa propre résolution de propriétés plutôt que d'utiliser Apache BeanUtils directement — probablement pour le contrôle des performances et la mise en cacheisEqualList() (package-privé) effectue une comparaison élément par élément en utilisant des itérateurs, pas equals(). Cela signifie que l'égalité des collections est basée sur l'identité/l'égalité des éléments aux positions correspondantes, et non sur l'égalité d'ensemble — deux listes avec les mêmes éléments dans un ordre différent ne sont pas égales.868d6abb7 2025 -> 2026 63081666f En-têtes des fichiers source : 2024 -> 2025. a73905c14 Correction de fautes de frappe dans les répertoires projectforge*/ Trouvé via codespell 694987647 Migration en cours... (tous les tests de tous les packages : OK). ae50b2522 BeanHelper.getProperty supporte désormais les propriétés imbriquées en utilisant simplement new PropertyUtils. b6092df09 Copyright 2023 -> 2024 ab45d51fa Copyright 2001-2022 -> 2001-2023. 0203e3261 AbstractListPage : requêtes longues : le changement d'ordre de tri affiche la liste des résultats sans bouton de recherche. BeanHelper : beaucoup de caches pour un tri plus rapide dans les listes de résultats Wicket.