2017-07-21 5 views
6

ich eine reguläre Java-Methode aus Kotlin rufen versuchen wie folgt:Converting Kotlin der KClass regelmäßig Klasse in Java

public <T> T proxy(KClass<T> kClass) { 
    // unfortunately nothing like getJavaClass() exists 
    return (T) proxy(kClass.getJavaClass()); 
} 

public <T> T proxy(Class<T> jClass) { 
    return (T) context.getBean(jClass); 
} 

In Kotlin können Sie .java auf jedem KClass nennen. Dies ist hier nicht der Fall, und ich kann das Java-Klassenobjekt nicht aus KClass extrahieren. Gibt es einen Weg, es zu tun?

Antwort

4

Die Funktionalität ist vorhanden, nur nicht, wo es scheint, als java ist eine Erweiterung Eigenschaft.

Verwenden Sie die Methode JvmClassMappingKt.getJavaClass.

In Kotlin werden Erweiterungsmethoden (und Eigenschaften-Getter/Setter) als static Methoden ihrer enthaltenden Klasse implementiert. Wenn Sie die Quelle für .java (Ctrl + Q) betrachten, können Sie sehen, dass es in JvmClassMapping.kt implementiert ist.

Da die Funktion Paket-Ebene ist und kein enthaltenes Objekt enthält, wird sie einfach in die Datei [Filename]Kt eingefügt, die in diesem Fall JvmClassMappingKt ist. Hier

ist die Quelle dieser Erweiterungseigenschaft:

@Suppress("UPPER_BOUND_VIOLATED") 
public val <T> KClass<T>.java: Class<T> 
    @JvmName("getJavaClass") 
    get() = (this as ClassBasedDeclarationContainer).jClass as Class<T> 

Wie Sie sehen können, die Methode der Name auf der JVM getJavaClass umbenannt.

In Ihrem Fall können Sie versuchen:

public <T> T proxy(KClass<T> kClass) { 
    return (T) proxy(JvmClassMappingKt.getJavaClass(kClass)); 
} 
Verwandte Themen