我在代码库中同时使用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中实现它? 有任何线索吗?
谢谢!
答案 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
属性和方法。