2017-07-21 15 views
6

próbuję zadzwonić regularny sposób Java z Kotlin następująco:Konwersja Kotlin za KClass do regularnej klasy w Javie

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); 
} 

W Kotlin, można zadzwonić .java na każdym KClass. Tak nie jest w tym przypadku i nie mogę wyodrębnić obiektu klasy Java z KClass. Czy jest jakiś sposób na zrobienie tego?

Odpowiedz

4

Funkcjonalność istnieje istnieje, po prostu nie tam, gdzie wydaje się, jako java jest właściwością rozszerzenia.

Użyj metody JvmClassMappingKt.getJavaClass.

W Kotlinie metody rozszerzania (i właściwości pobierające/ustawiające właściwości) są implementowane jako static metody ich klasy zawierającej. Jeśli spojrzysz na źródło dla .java (Ctrl + Q), możesz zobaczyć, że jest zaimplementowane w JvmClassMapping.kt.

Ponieważ funkcja jest pakietowa i nie zawiera obiektu zawierającego, jest po prostu umieszczana w pliku [Filename]Kt, który w tym przypadku to JvmClassMappingKt.

Tu jest źródło tej właściwości Rozszerzenie:

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

Jak widać, nazwa tejże metody jest przemianowany na JVM do getJavaClass.

W twoim przypadku, można spróbować:

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