繁体   English   中英

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

[英]How do I call a function written in a kotlin class , in java?

我在我的代码库中使用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完全相同。 请记住,它们共享相同的底层字节码

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM