Estoy creando una biblioteca. En una de las funcionalidades, recibo un objeto y tengo que realizar una operación en los campos y guardarlos en un Mapa. El objeto puede tener un campo de tipo clase personalizada que nuevamente tendrá campos y, en ese caso, necesitaré un hashmap anidado. Para hacer eso, tendré que llamar a mi función de forma recursiva si el tipo de campo en una clase personalizada.
Ahora el problema es, ¿cómo verificaré si el tipo de campo es una clase personalizada o no? Ahora mismo lo estoy haciendo por nombre de paquete, pero tengo que generalizarlo.
private fun getAllFields(`object`: Any): MutableMap<String, Any> { val map: MutableMap<String, Any> = HashMap() val internalMap: MutableMap<String, Any> = HashMap() for (field in `object`::class.java.declaredFields.toMutableList()) { field.isAccessible = true if (field.type.name.contains("com.example")) { internalMap.putAll(getAllFields(field.get(`object`))) }Como está usando la reflexión, podría introducir una anotación:
package org.your.library @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) annotation class YourCoolAnnotationQue luego pueden usar los usuarios de su biblioteca para anotar las clases que desean anidar:
package com.example.libraryuser @YourCoolAnnotation class MyCustomClassEntonces puedes reemplazar tu:
if (field.type.name.contains("com.example")) {Con:
if (field.type.isAnnotationPresent(YourCoolAnnotation::class.java)) {También puede especificar que la anotación solo se use en los campos, lo que haría que esto fuera mucho más dinámico:
@Target(AnnotationTarget.PROPERTY) @Retention(AnnotationRetention.RUNTIME) annotation class YourCoolAnnotationy luego verifique si el campo tiene la anotación y no el tipo en sí:
if (field.isAnnotationPresent(YourCoolAnnotation::class.java)) {