#java #kotlin
#java #kotlin
Вопрос:
Я создаю библиотеку, в одной из функций я получаю объект, и мне нужно выполнить операцию с полями и сохранить их на карте. Объект может иметь поле типа custom class, которое снова будет иметь поля, и в этом случае мне понадобится вложенная хэш-карта. Для этого мне нужно будет вызвать мою функцию рекурсивно, если тип поля в пользовательском классе.
Теперь проблема в том, как я буду проверять, является ли тип поля пользовательским классом или нет, прямо сейчас я делаю это по имени пакета, но должен сделать его общим
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`)))
}
Комментарии:
1. Это случайно не проблема xy? xyproblem.info
Ответ №1:
Поскольку вы используете отражение, вы могли бы ввести аннотацию:
package org.your.library
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class YourCoolAnnotation
Который затем может использоваться пользователями вашей библиотеки для аннотирования классов, которые они хотят вложить:
package com.example.libraryuser
@YourCoolAnnotation
class MyCustomClass
Затем вы можете заменить свой:
if (field.type.name.contains("com.example")) {
С помощью:
if (field.type.isAnnotationPresent(YourCoolAnnotation::class.java)) {
Вы также можете указать аннотацию, которая будет использоваться только для полей, что сделает это намного более динамичным:
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.RUNTIME)
annotation class YourCoolAnnotation
а затем проверьте, имеет ли поле аннотацию, а не сам тип:
if (field.isAnnotationPresent(YourCoolAnnotation::class.java)) {
Комментарии:
1. отличная идея, я осмотрюсь