BeanHelper.javaorg.apache.commons.lang3.ArrayUtils — Concatenación de arreglos para recolección de campos/métodos en la jerarquía de clasesorg.apache.commons.lang3.StringUtils — Manipulación de cadenas (capitalizar, descapitalizar, dividir)java.lang.annotation.Annotation — Descubrimiento de anotaciones en camposjava.lang.reflect.* — API de reflexión central de Java: Field, Method, Constructor, Modifier, Array, InvocationTargetExceptionjava.util.* — Colecciones, iteradores, mapas hash para almacenamiento en cachéorg.slf4j.Logger — Registro de errores para fallos de reflexiónBeanHelper utiliza cinco cachés sincronizadas estáticas para evitar llamadas de reflexión repetidas, que son costosas en Java. Esto es crítico para las páginas de listas de Wicket donde se llama a BeanHelper para cada celda en una tabla de datos ordenable.
| Caché | Clave | Valor | Beneficio |
|---|---|---|---|
declaredFieldsCache | Class | Field[] | Evita volver a escanear la jerarquía de clases en busca de campos |
declaredMethodsCache | Class | Method[] | Evita volver a escanear la jerarquía de clases en busca de métodos |
declaredFieldAnnotationsCache | "clase:nombrecampo" | Annotation[] | Evita volver a resolver campos anotados (crítico para la ordenación de columnas en Wicket) |
getterMethodsCache | "clase:nombrecampo" | Method | Evita volver a buscar métodos getter |
declaredGetterMethodsCache | String | Method[] | Declarado pero parece no usarse en el código proporcionado — puede poblarse en otro lugar |
determinePropertyName(Method) — Elimina el prefijo get/set/is/has y convierte a minúscula el primer carácterdetermineGetter(Class, nombrecampo, soloGetterPublico) — Encuentra el método getter (getX(), isX() para booleanos, hasX() para booleanos), maneja métodos puente (no devuelve métodos sintéticos puente)determineSetter(Class, nombrecampo) — Encuentra el setter con un solo parámetrodeterminePropertyType(Class, nombrecampo) — Obtiene el tipo de retorno del getter (tipo de propiedad)getDeclaredAnnotations(Class, nombrecampo) soporta rutas de propiedades anidadas (separadas por puntos, ej., "direccion.ciudad.nombre") recorriendo la cadena de campos a través de la reflexión para encontrar las anotaciones del campo terminal. Esto es esencial para las tablas de datos de Wicket que muestran propiedades de objetos anidados con columnas ordenables.
getProperty(Object, String) — Invoca el getter en un beansetProperty(Object, String, Object) — Invoca el settergetIndexedProperty(Object, "prop[3]") — Soporta acceso indexado a colecciones/arreglosgetNestedProperty(Object, "a.b.c") — Recorre la ruta de propiedades separadas por puntos, manejando nulos de forma segura (devuelve null si algún intermedio es nulo)Copia las propiedades especificadas del objeto origen al destino, devolviendo true si alguna propiedad realmente cambió. Soporta:
Arrays.equals()Objects.equals() (seguro para nulos)getAllDeclaredFields(Class) — Devuelve todos los campos, incluidos los heredados, recorriendo la cadena de superclasesgetAllDeclaredMethods(Class) — Devuelve todos los métodos, incluidos los heredadosgetDeclaredPropertyFields(Class) — Devuelve solo campos no transitorios, no estáticos y no finales (propiedades persistentes reales)getFieldValue(Object, Class/String, nombrecampo) — Lee el valor del campo mediante reflexión (setAccessible para campos privados)newInstance(Class, ...) — Múltiples sobrecargas para construcción reflexiva de objetos con varias firmas de constructoresinvoke(Object, Method, args) — Invocación genérica de métodos con manejo de erroresLa bandera TEST_MODE (controlada por enterTestMode()/exitTestMode()) suprime el registro de errores durante la ejecución de pruebas. Esto permite que las pruebas intenten operaciones de reflexión que se espera que fallen sin contaminar los registros de prueba con trazas de pila. Los métodos logInstantiationException() respetan esta bandera.
determineGetter() omite los métodos puente (métodos sintéticos creados por el compilador para la eliminación de tipos genéricos) para devolver el método real implementadogetNestedProperty() devuelve null en cualquier punto de la cadena donde un valor intermedio sea nulo, en lugar de lanzar NPEnewInstance() llama a constructor.setAccessible(true) para instanciar clases con constructores privadoscommons-beanutils en la compilación de Gradle, BeanHelper implementa su propia resolución de propiedades en lugar de usar Apache BeanUtils directamente — probablemente para control de rendimiento y almacenamiento en cachéisEqualList() (privado del paquete) realiza una comparación elemento por elemento usando iteradores, no equals(). Esto significa que la igualdad de colecciones se basa en la identidad/igualdad de elementos en posiciones correspondientes, no en la igualdad de conjuntos — dos listas con los mismos elementos en diferente orden no son iguales.868d6abb7 2025 -> 2026 63081666f Encabezados de archivos fuente: 2024 -> 2025. a73905c14 Corrección de errores tipográficos en directorios projectforge*/ Encontrados mediante codespell 694987647 Migración en progreso... (todas las pruebas de todos los paquetes: OK). ae50b2522 BeanHelper.getProperty ahora soporta propiedades anidadas usando simplemente new PropertyUtils. b6092df09 Copyright 2023 -> 2024 ab45d51fa Copyright 2001-2022 -> 2001-2023. 0203e3261 AbstractListPage: consultas de larga duración: el cambio de orden de clasificación muestra la lista de resultados sin el botón de búsqueda. BeanHelper: muchas cachés para una clasificación más rápida en las listas de resultados de Wicket.