我在我的代码库中使用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
属性和方法。