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

问题描述 投票:4回答:1

我在我的代码库中使用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()识别)但是我们想知道我们如何在java中实现它?任何线索?

提前致谢!

java android kotlin
1个回答
4
投票

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

companion对象被转换为Java中的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属性和方法。

© www.soinside.com 2019 - 2024. All rights reserved.