如何在Java中调用用kotlin类编写的函数?

时间:2019-03-21 15:06:11

标签: java android kotlin

我在代码库中同时使用Kotlin和Java。 但是我想知道是否可以通过java引用kotlin函数吗? 这是我的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 个答案:

答案 0 :(得分:4)

与Java完全相同。请记住,他们共享相同的 基础 bytecode

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()
  ...

在Java中,companion对象被转换为static类属性。
例如,对于此Kotlin代码

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属性和方法。