KT Kotlin  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Рефлексия и аннотации

Тест охватывает KClass, ссылки на свойства, цели аннотаций и стоимость рефлексии. Нужно отличать метаданные, доступные компилятору, от данных во время выполнения и понимать, где динамика оправдана, а где проще сохранить явный контракт.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
Какой пограничный сценарий обязательно добавить к проверкам «Конкурентный кэш метаданных»?
Вопрос 2 из 30
Какой дополнительный сценарий нужен для «Runtime-класс объекта»?
Вопрос 3 из 30
Какой побочный эффект существеннее остальных после правки «Typed property reference»: Передавать typed property references для маппинга и сортировки вместо строк имён, когда набор свойств известен компилятору?
Вопрос 4 из 30
Куда попадёт `Mark` в этом объявлении?
KotlinЦели аннотаций · Use-site target getter
// Проследите фактическое выполнение без изменения кода.
@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER)
annotation class Mark

class Model(@get:Mark val id: String)
Вопрос 5 из 30
Какой контракт определяет наблюдаемый результат «Динамический обход properties»?
KotlinЦена динамики · Динамический обход properties
// На ревью требуется объяснить причину поведения.
import kotlin.reflect.*
fun values(obj: Any): List<Any?> = obj::class.members
    .filterIsInstance<kotlin.reflect.KProperty1<Any, *>>()
    .map { it.get(obj) }
Вопрос 6 из 30
Как сделать ответственность во фрагменте «Чтение runtime-аннотации» понятной следующему разработчику?
KotlinТестирование и инструменты · Чтение runtime-аннотации
// Сохраните назначение фрагмента, но укрепите его контракт.
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY_GETTER)
annotation class JsonName(val value: String)

class User(@get:JsonName("user_name") val name: String)
Вопрос 7 из 30
Какой побочный эффект существеннее остальных после правки «Runtime-класс объекта»: Использовать явные типовые токены или sealed-регистрацию вместо сравнения `simpleName`, которое нестабильно при обфускации?
Вопрос 8 из 30
Что появится в выводе примера «Typed property reference»?
KotlinСсылки на свойства · Typed property reference
// Проследите фактическое выполнение без изменения кода.
data class User(val name: String, var age: Int)
fun main() {
    val p = User::name
    println(p.get(User("Ada", 36)))
}
Вопрос 9 из 30
Что точнее описывает механику фрагмента «Use-site target getter»?
KotlinЦели аннотаций · Use-site target getter
// На ревью требуется объяснить причину поведения.
@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER)
annotation class Mark

class Model(@get:Mark val id: String)
Вопрос 10 из 30
Как укрепить «Динамический обход properties», не переписывая соседние модули?
KotlinЦена динамики · Динамический обход properties
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlin.reflect.*
fun values(obj: Any): List<Any?> = obj::class.members
    .filterIsInstance<kotlin.reflect.KProperty1<Any, *>>()
    .map { it.get(obj) }
Вопрос 11 из 30
Какой тест лучше всего защищает край контракта «Чтение runtime-аннотации»?
Вопрос 12 из 30
Что станет новой точкой внимания после изменения «Конкурентный кэш метаданных»: Строить immutable Meta локально, ограничить ключи жизненным циклом приложения и обработать циклические модели без рекурсивного deadlock?
Вопрос 13 из 30
Что точнее описывает механику фрагмента «Typed property reference»?
KotlinСсылки на свойства · Typed property reference
// На ревью требуется объяснить причину поведения.
data class User(val name: String, var age: Int)
fun main() {
    val p = User::name
    println(p.get(User("Ada", 36)))
}
Вопрос 14 из 30
Какую правку выбрать, чтобы сохранить назначение «Use-site target getter» и убрать хрупкость?
KotlinЦели аннотаций · Use-site target getter
// Сохраните назначение фрагмента, но укрепите его контракт.
@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER)
annotation class Mark

class Model(@get:Mark val id: String)
Вопрос 15 из 30
Какой контрпример точнее всего показывает границу «Динамический обход properties»?
Вопрос 16 из 30
Какую обратную сторону имеет решение для «Чтение runtime-аннотации»: Добавить небольшой fixture-модуль со shrinker/обфускацией, если имена и runtime retention критичны в выпуске?
Вопрос 17 из 30
Что нужно доказать у такого кэша?
KotlinАрхитектура и конкурентность · Конкурентный кэш метаданных
// Проследите фактическое выполнение без изменения кода.
import kotlin.reflect.*
class MetadataCache {
    private val cache = java.util.concurrent.ConcurrentHashMap<KClass<*>, Meta>()
    fun forClass(type: KClass<*>): Meta = cache.computeIfAbsent(type) { inspect(it) }
}
Вопрос 18 из 30
Что примерно вернёт функция для обычного списка?
KotlinМетаданные KClass · Runtime-класс объекта
// Проследите фактическое выполнение без изменения кода.
fun nameOf(x: Any): String? = x::class.simpleName
fun main() = println(nameOf(listOf(1, 2)))
Вопрос 19 из 30
Какой сценарий выявит скрытое ограничение «Use-site target getter»?
Вопрос 20 из 30
Какой побочный эффект существеннее остальных после правки «Динамический обход properties»: Кэшировать проверенные метаданные, ограничить допустимые классы и предпочитать generated adapters для горячего пути?
Вопрос 21 из 30
Как проверить контракт аннотации?
KotlinТестирование и инструменты · Чтение runtime-аннотации
// Проследите фактическое выполнение без изменения кода.
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY_GETTER)
annotation class JsonName(val value: String)

class User(@get:JsonName("user_name") val name: String)
Вопрос 22 из 30
Какое утверждение точнее всего объясняет поведение фрагмента «Конкурентный кэш метаданных»?
KotlinАрхитектура и конкурентность · Конкурентный кэш метаданных
// На ревью требуется объяснить причину поведения.
import kotlin.reflect.*
class MetadataCache {
    private val cache = java.util.concurrent.ConcurrentHashMap<KClass<*>, Meta>()
    fun forClass(type: KClass<*>): Meta = cache.computeIfAbsent(type) { inspect(it) }
}
Вопрос 23 из 30
Какой контракт снимает спор о причине поведения «Runtime-класс объекта»?
KotlinМетаданные KClass · Runtime-класс объекта
// На ревью требуется объяснить причину поведения.
fun nameOf(x: Any): String? = x::class.simpleName
fun main() = println(nameOf(listOf(1, 2)))
Вопрос 24 из 30
Что стоит исправить в «Typed property reference» перед слиянием?
KotlinСсылки на свойства · Typed property reference
// Сохраните назначение фрагмента, но укрепите его контракт.
data class User(val name: String, var age: Int)
fun main() {
    val p = User::name
    println(p.get(User("Ada", 36)))
}
Вопрос 25 из 30
Какой риск есть у такого универсального извлечения?
KotlinЦена динамики · Динамический обход properties
// Проследите фактическое выполнение без изменения кода.
import kotlin.reflect.*
fun values(obj: Any): List<Any?> = obj::class.members
    .filterIsInstance<kotlin.reflect.KProperty1<Any, *>>()
    .map { it.get(obj) }
Вопрос 26 из 30
Почему поведение «Чтение runtime-аннотации» не является случайностью?
KotlinТестирование и инструменты · Чтение runtime-аннотации
// На ревью требуется объяснить причину поведения.
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY_GETTER)
annotation class JsonName(val value: String)

class User(@get:JsonName("user_name") val name: String)
Вопрос 27 из 30
Какую точечную правку стоит принять на ревью фрагмента «Конкурентный кэш метаданных»?
KotlinАрхитектура и конкурентность · Конкурентный кэш метаданных
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlin.reflect.*
class MetadataCache {
    private val cache = java.util.concurrent.ConcurrentHashMap<KClass<*>, Meta>()
    fun forClass(type: KClass<*>): Meta = cache.computeIfAbsent(type) { inspect(it) }
}
Вопрос 28 из 30
Что стоит исправить в «Runtime-класс объекта» перед слиянием?
KotlinМетаданные KClass · Runtime-класс объекта
// Сохраните назначение фрагмента, но укрепите его контракт.
fun nameOf(x: Any): String? = x::class.simpleName
fun main() = println(nameOf(listOf(1, 2)))
Вопрос 29 из 30
Какой дополнительный сценарий нужен для «Typed property reference»?
Вопрос 30 из 30
Какой риск не исчезает после правки «Use-site target getter»: Сверить target с потребителем фреймворка и добавить reflection/compile-test, который читает аннотацию тем же способом?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу