Estoy usando tanto Kotlin como Java en mi base de código. Pero me preguntaba si hay alguna manera de hacer referencia a una función de Kotlin desde Java. Aquí está mi código 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() } }Ahora, en mi llamada de clase de aplicación base "MyApplication", quiero llamar a la función de identificación. (Sé que en kotlin podemos hacer esto a través de MyEvent().identify) pero me preguntaba cómo lo hacemos en Java. ¿Cualquier pista?
¡Gracias por adelantado!
Es exactamente lo mismo en Java. Tenga en cuenta que comparten el mismo código de bytes subyacente.
final MyEvent myEvent = new MyEvent(); myEvent.identify(); Mire el código de bytes producido para la clase Kotlin MyEvent (descompilado)
public class my/package/MyEvent { ... public final identify()V L0 LINENUMBER 14 L0 RETURN // Omitted myService.identify() ... Un objeto companion se traduce a una propiedad de clase static en Java.
Por ejemplo, para este código Kotlin
open class MyEvent { companion object { fun test() = "" } ... }Este es el bytecode resultante.
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 }Lo que significa, básicamente
public class MyEvent { public static final Companion Companion = new Companion(...); ... }Entonces, en Java accederías usando
MyEvent.Companion.test();Para
open class MyEvent { object Factory { fun test() = "" } ... }Sería, en Java
MyEvent.Factory.INSTANCE.test(); En última instancia, Java no tiene el concepto de objetos complementarios.
En su lugar, se utilizan propiedades y métodos static .