Я видел этот замечательный разговор Лизы Рэй некоторое время назад https://youtu.be/0cjr4K0tqs4?t=493, который вдохновил меня на создание разных делегатов Property для всех моих привязок, таких как BindActivity(layoutId)
, BindFragment
, BindViewGroup
и т. Д. Мой коллега создалфункции расширения для таких же, как Activity.bind(layoutId)
, View.bind()
, ViewGroup.bind()
и т. д., которые заставили меня задуматься о том, что должно быть предпочтительнее, чем здесь.Я попытался декомпилировать байт-код kotlin, и он:
- Property Delegation создаст новый объект, такой как
private final BindActivity binding$delegate = new BindActivity(2131361819);
Кажется, он использует Reflection, что-то вроде следующегоинициализировать KProperty
:
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(MainActivity.class), "binding", "getBinding()Lcom/abcd/package/databinding/ActivityMainBinding;")), … another lazy delegated property};
(ActivityMainBinding)this.binding$delegate.getValue((Activity)this, $$delegatedProperties[0])
Вопрос 1: Если делегирование свойства использует отражение, что такоедело их использовать?
Вопросы 2: Кроме того, класс Reflection
Котлина, похоже, использует некоторую фабрику отражений kotlin.reflect.jvm.internal.ReflectionFactoryImpl
, значит ли это, что отражение в котлине может быть не таким медленным, как в Java?