Intereting Posts
Kotlin использует утверждения времени выполнения для проверки нуля – служебные накладные расходы? Библиотека сохранности Android Room и Kotlin Странное поведение compose и ObservableTransformer в RxJava, когда переданный родословный расширяет что-то Ошибка компилятора Java при связывании с бандой компилятора kotlin с использованием ant Применить @JvmStatic и @JvmField автоматически ко всем файлам в Котлине Не удалось найти org.jetbrains.kotlinx: kotlinx-html: 0.6.4 Как сохранить логотип над рушащейся панелью инструментов Как найти все классы в пакете, используя отражение в kotlin Как опустить параметр конструктора со значением по умолчанию при вызове Kotlin в Java? Невозможно ссылаться на подкласс в Котлине Диффузия и мультивыбор У меня есть запрос Vertx, и мне нужно вычислить внешний видимый (общедоступный) URL-адрес Аргумент типа не распознан в Котлине Как установить конфигурации package.json с помощью kotlin-frontend-plugin restAssured – невозможно обработать почтовый метод

Аннотации для весны с Котлином

Kotlin не может вводить аннотацию во время компиляции, например, существующей библиотекой Lombok . Есть ли достойный способ вставить аннотацию для весеннего фреймворка во время выполнения?

Предполагая, что вы пытаетесь ввести аннотацию журнала в приложение Spring.

Вот пример класса аннотации: Log.kt

package com.example.util @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FIELD) @MustBeDocumented annotation class Log 

Этот класс вводит аннотацию во время выполнения: LogInjector.kt

 package com.example.util import org.slf4j.LoggerFactory import org.springframework.beans.BeansException import org.springframework.beans.factory.config.BeanPostProcessor import org.springframework.stereotype.Component import org.springframework.util.ReflectionUtils import java.lang.reflect.Field @Component class LogInjector: BeanPostProcessor { @Throws(BeansException::class) override fun postProcessAfterInitialization(bean: Any, beanName: String): Any { return bean } @Throws(BeansException::class) override fun postProcessBeforeInitialization(bean: Any, name: String): Any { ReflectionUtils.doWithFields(bean.javaClass, @Throws(IllegalArgumentException::class, IllegalAccessException::class) { field: Field -> // SAM conversion for Java interface ReflectionUtils.makeAccessible(field) if (field.getAnnotation(Log::class.java) != null) { val log = LoggerFactory.getLogger(bean.javaClass) field.set(bean, log) } } ) return bean } } 

Затем этот класс использует аннотацию @Log : GreetingController.kt

 package com.example.web import org.slf4j.Logger import org.springframework.web.bind.annotation.* @RestController class GreetingController { @Log lateinit private var logger: Logger @RequestMapping("/greeting") fun greeting(): String { logger.info("Greeting endpoint was called") return "Hello" } } 

Чтобы избежать вызова журнала в нуль-безопасном, таком как logger?.info('...') , этот пример отмечает свойство поздним инициализированным модификатором .