Функциональная совместимость отражения Котлина с Java

Каковы предостережения, о которых разработчик должен знать при написании отражающего кода, который работает как с Java, так и с Kotlin?

Например, у меня есть существующая библиотека, которая использует отражение, и она хорошо работает с Java. Однако, когда я использую то же самое с Kotlin, мой отражающий код, похоже, не подбирает аннотации по полям.

Вот некоторые из различий, которые я заметил.

1. Приобретение экземпляра класса

// Example 1.1 - Java Class<?> userClass = User.class; // From a class name userClass = userInstance.getClass(); // OR from an instance 

Получение экземпляра класса Java в Котлине

 // Example 1.2 - Kotlin val userClass = userInstance.javaClass // From an instance 

Я не могу использовать средство .class или метод .getClass() в Kotlin, как в Java.

2. Делегаты

Когда я использую делегированные свойства в классе Kotlin, свойства, которые я получаю, имеют суффикс $delegate . Это немного противоречит полям, которые мы получаем на Java (я понимаю, что у Kotlin нет полей, только свойств). Как это влияет на метапрограммирование?

Однако с делегатами я вижу, что большинство методов сохраняют свое поведение, как в Java. Есть ли еще какие-то различия, о которых я должен знать?

Для меня совместимость с Java и Kotlin потребует понимания того, о чем говорилось выше, плюс другие ограничения / различия, которые Котлин привносит в метапрограммирование.

Например, у меня есть существующая библиотека, которая использует отражение, и она хорошо работает с Java. Однако, когда я использую то же самое с Kotlin, мой отражающий код, похоже, не подбирает аннотации на полях.

Может быть, потому, что поля теперь закрыты?

Во всяком случае, на данный момент есть проблемы с аннотациями по полям, это будет зафиксировано на предстоящих вехах.

Некоторые другие актуальные проблемы:

Я не могу использовать средство .class или метод .getClass () в Kotlin, как в Java.

Только синтаксис отличается: javaClass<C>() работает точно так же, как и C.class , а x.javaClass делает то же самое, что x.getClass()

Когда я использую делегированные свойства в классе Kotlin, свойства, которые я получаю, имеют суффикс $ delegate.

Незначительная коррекция: поля имеют суффикс $delegate , а не свойства.

Однако с делегатами я вижу, что большинство методов сохраняют свое поведение, как в Java. Есть ли еще какие-то различия, о которых я должен знать?

В документах приведено подробное описание того, как реализованы делегированные свойства.

Для меня совместимость с Java и Kotlin потребует понимания того, о чем говорилось выше, плюс другие ограничения / различия, которые Котлин привносит в метапрограммирование.

Чем больше ваш код Котлина похож на Java-код, тем меньше разница с точкой отражения. Если вы пишете идиоматический Kotlin, например, используйте значения параметров по умолчанию, черты, свойства, делегаты, функции верхнего уровня, расширения и т. Д., Классы, которые вы получаете, отличаются от идиоматической Java, в противном случае они тесно выровнены.

Intereting Posts
Элементы типа «subs» не могут быть использованы. response: -1010: Неправильная попытка потребления Выполнение команды Интерфейс vs Function Invocation Создание настраиваемой масштабируемой и масштабируемой ViewGroup, которая расширяет ConstraintLayout Тесты для Android выполняются без lanuching эмулятора (не отображается диалоговое окно устройства) – пустой набор тестов Как передать null в Observable с типом NULL в RxJava 2 и Kotlin Ярлык для «Преобразовать java-код (не файл) в kotline" Kotlin – Как «запоздать» var переопределил интерфейс? Как получить дочерний jSON-объект в Android При щелчке спискаView Требуется <Объект> и найден <Объект>? Android с изменением даты и времени, но снова надавить, Firebase просто возвращает истекший токен Плагин 'org.jetbrains.kotlin' не удалось инициализировать и будет отключен. Перезапустите Android Studio Измените только один метод класса из java в kotlin Ошибка коплинской капсулы Захват и сохранение изображения с помощью Kotlin в Android Studio Lazy переменная с сбросом