Как мне вызвать функцию, написанную в классе kotlin, в Java? - PullRequest
4 голосов
/ 21 марта 2019

Я использую Kotlin и Java в моей кодовой базе.Но мне было интересно, есть ли способ ссылаться на функцию kotlin из Java?Вот мой код kotlin: MyEvent.kt

open class MyEvent {
    @Inject
    lateinit var myService: MyService

    @Inject
    lateinit var app: MyApp

    var name: String = ""
    var options: MutableMap<String, String> = hashMapOf()
    var metrics: MutableMap<String, Double> = hashMapOf()

    init {
        app.component.inject(this)
    }

    fun identify() {
        myService.identify()
    }

}

Теперь в моем базовом вызове класса приложения «MyApplication» я хочу вызвать функцию идентификации.(Я знаю, что в kotlin мы можем сделать это через MyEvent (). Identify), но было интересно, как мы можем сделать это в Java?Любая подсказка?

Заранее спасибо!

1 Ответ

4 голосов
/ 21 марта 2019

Это то же самое в Java.Имейте в виду, что они имеют один и тот же базовый байт-код .

final MyEvent myEvent = new MyEvent();
myEvent.identify();

Посмотрите на полученный байт-код для класса Kotlin MyEvent (декомпилированный)

public class my/package/MyEvent {
  ...

  public final identify()V
   L0
    LINENUMBER 14 L0
    RETURN // Omitted myService.identify()
  ...

A companion объект переводится в свойство класса static в Java.
Например, для этого кода Котлина

open class MyEvent {
    companion object {
        fun test() = ""
    }
    ...
}

Это результирующий байт-код

static <clinit>()V
    NEW my/package/MyEvent$Companion
    DUP
    ACONST_NULL
    INVOKESPECIAL my/package/MyEvent$Companion.<init> (Lkotlin/jvm/internal/DefaultConstructorMarker;)V
    PUTSTATIC my/package/MyEvent.Companion : Lmy/package/MyEvent$Companion;
    RETURN
    MAXSTACK = 3
    MAXLOCALS = 0
}

Что означает, в основном

public class MyEvent {
   public static final Companion Companion = new Companion(...);
   ...
}

Итак, в Java вы можете получить к нему доступ, используя

MyEvent.Companion.test();

Для

open class MyEvent {
    object Factory {
        fun test() = ""
    }
    ...
}

Было быв Java

MyEvent.Factory.INSTANCE.test();

В конечном итоге в Java нет концепции сопутствующих объектов.
Вместо этого используются static свойства и методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...