BeanHelper.javaorg.apache.commons.lang3.ArrayUtils — Array-Verkettung für Feld-/Methodensammlung über die Klassenhierarchie hinwegorg.apache.commons.lang3.StringUtils — Zeichenkettenmanipulation (Großschreibung, Kleinschreibung, Teilen)java.lang.annotation.Annotation — Annotationserkennung auf Feldernjava.lang.reflect.* — Kern-Java-Reflection-API: Field, Method, Constructor, Modifier, Array, InvocationTargetExceptionjava.util.* — Collections, Iteratoren, Hash-Maps für Cachingorg.slf4j.Logger — Fehlerprotokollierung für ReflektionsfehlerBeanHelper verwendet fünf statische synchronisierte Caches, um wiederholte Reflektionsaufrufe zu vermeiden, die in Java teuer sind. Dies ist entscheidend für Wicket-Listenseiten, bei denen BeanHelper für jede Zelle in einer sortierbaren Datentabelle aufgerufen wird.
| Cache | Schlüssel | Wert | Nutzen |
|---|---|---|---|
declaredFieldsCache | Class | Field[] | Vermeidet erneutes Durchsuchen der Klassenhierarchie nach Feldern |
declaredMethodsCache | Class | Method[] | Vermeidet erneutes Durchsuchen der Klassenhierarchie nach Methoden |
declaredFieldAnnotationsCache | "Klasse:Feldname" | Annotation[] | Vermeidet erneutes Auflösen annotierter Felder (entscheidend für Wicket-Spaltensortierung) |
getterMethodsCache | "Klasse:Feldname" | Method | Vermeidet erneute Suche nach Getter-Methoden |
declaredGetterMethodsCache | String | Method[] | Deklariert, aber im bereitgestellten Code scheinbar ungenutzt — könnte anderswo befüllt werden |
determinePropertyName(Method) — Entfernt get/set/is/has-Präfix und wandelt das erste Zeichen in Kleinbuchstaben umdetermineGetter(Class, Feldname, onlyPublicGetter) — Findet Getter-Methode (getX(), isX() für Booleans, hasX() für Booleans), behandelt Brückenmethoden (gibt keine gebrückten synthetischen Methoden zurück)determineSetter(Class, Feldname) — Findet Setter mit einem einzelnen ParameterdeterminePropertyType(Class, Feldname) — Ermittelt den Rückgabetyp des Getters (Eigenschaftstyp)getDeclaredAnnotations(Class, Feldname) unterstützt verschachtelte Eigenschaftspfade (punktgetrennt, z. B. "adresse.stadt.name"), indem die Feldkette durch Reflektion durchlaufen wird, um die Annotationen des Endfelds zu finden. Dies ist essentiell für Wicket-Datentabellen, die verschachtelte Objekteigenschaften mit sortierbaren Spalten anzeigen.
getProperty(Object, String) — Ruft Getter auf einem Bean aufsetProperty(Object, String, Object) — Ruft Setter aufgetIndexedProperty(Object, "prop[3]") — Unterstützt indizierten Zugriff auf Collections/ArraysgetNestedProperty(Object, "a.b.c") — Durchläuft punktgetrennten Eigenschaftspfad und behandelt Nullwerte elegant (gibt null zurück, wenn ein Zwischenwert null ist)Kopiert angegebene Eigenschaften vom Quell- zum Zielobjekt und gibt true zurück, wenn sich eine Eigenschaft tatsächlich geändert hat. Unterstützt:
Arrays.equals()Objects.equals() (nullsicher)getAllDeclaredFields(Class) — Gibt alle Felder einschließlich geerbter zurück, durchläuft die SuperklassenkettegetAllDeclaredMethods(Class) — Gibt alle Methoden einschließlich geerbter zurückgetDeclaredPropertyFields(Class) — Gibt nur nicht-transiente, nicht-statische, nicht-finale Felder zurück (tatsächliche persistente Eigenschaften)getFieldValue(Object, Class/String, Feldname) — Liest Feldwert via Reflektion (setAccessible für private Felder)newInstance(Class, ...) — Mehrere Überladungen für reflektive Objektkonstruktion mit verschiedenen Konstruktorsignatureninvoke(Object, Method, args) — Generischer Methodenaufruf mit FehlerbehandlungDas TEST_MODE-Flag (gesteuert durch enterTestMode()/exitTestMode()) unterdrückt die Fehlerprotokollierung während der Testausführung. Dies ermöglicht Tests, Reflektionsoperationen zu versuchen, die voraussichtlich fehlschlagen, ohne die Testprotokolle mit Stacktraces zu verschmutzen. Die Methoden logInstantiationException() beachten dieses Flag.
determineGetter() überspringt Brückenmethoden (synthetische Methoden, die vom Compiler für generische Typlöschung erstellt wurden), um die tatsächlich implementierte Methode zurückzugebengetNestedProperty() gibt an jedem Punkt der Kette null zurück, an dem ein Zwischenwert null ist, anstatt eine NPE zu werfennewInstance() ruft constructor.setAccessible(true) auf, um Klassen mit privaten Konstruktoren zu instanziierencommons-beanutils im Gradle-Build implementiert BeanHelper seine eigene Eigenschaftsauflösung anstatt Apache BeanUtils direkt zu verwenden — wahrscheinlich aus Leistungs- und Cache-KontrollgründenisEqualList() (paketprivat) führt einen elementweisen Vergleich unter Verwendung von Iteratoren durch, nicht equals(). Dies bedeutet, dass die Collection-Gleichheit auf der Elementidentität/Gleichheit korrespondierender Positionen basiert, nicht auf der Mengengleichheit — zwei Listen mit denselben Elementen in unterschiedlicher Reihenfolge sind nicht gleich.868d6abb7 2025 -> 2026 63081666f Quelltextdatei-Header: 2024 -> 2025. a73905c14 Korrigiere Tippfehler in projectforge/*-Verzeichnissen Gefunden via codespell 694987647 Migration stuff in progress... (alle Tests aller Pakete: OK). ae50b2522 BeanHelper.getProperty unterstützt jetzt verschachtelte Eigenschaften durch einfache Verwendung von new PropertyUtils. b6092df09 Copyright 2023 -> 2024 ab45d51fa Copyright 2001-2022 -> 2001-2023. 0203e3261 AbstractListPage: langlaufende Abfragen: Änderung der Sortierreihenfolge zeigt Ergebnisliste ohne Suchbutton. BeanHelper: viele Caches für schnellere Sortierung in Wicket-Ergebnislisten.