Определение пользовательского класса в Kotlin

#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. отличная идея, я осмотрюсь