Cómo convertir un archivo fuente Kotlin en un archivo fuente Java

389

Tengo un archivo fuente de Kotlin, pero quiero traducirlo a Java.

¿Cómo puedo convertir Kotlin a fuente Java?

decadencia activa
fuente
10
Estoy bastante seguro de que todavía no se ha creado una herramienta automatizada para esto. ¡Puedes construirlo primero!
Eric Cochran
77
Es muy probable que termines con una clase de Java fea e insostenible que no se ejecutará si no tienes la biblioteca estándar de Kotlin en el classpath. ¿Cuál es el punto de?
yole
3
Considere el traductor j2objC. Sería genial si pudieras hacer kotlin -> Java -> objC
Patrick el
3
El objetivo del botón "Descompilar" es ayudar a las personas a comprender cómo funciona la compilación de Kotlin. El código Java que genera no está destinado para su uso como código de producción real (y es bastante poco adecuados para que - en primer lugar, no siempre se compila ...)
Yole
2
@yole, ¿qué tal para alguien que no conoce Kotlin o no tiene tiempo para aprenderlo y tiene un código de muestra en ese idioma que tiene alguna funcionalidad que necesitan entender para que su código Java funcione?
Michael

Respuestas:

400

Como dijo @Vadzim, en IntelliJ o Android Studio, solo tiene que hacer lo siguiente para obtener el código java de kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Haga clic en el Decompilebotón
  3. Copia el código de Java

Actualizar:

Con una versión reciente (1.2+) del complemento Kotlin, también puede hacerlo directamente Menu > Tools > Kotlin -> Decompile Kotlin to Java.

Louis CAD
fuente
6060
¿La salida de Java no es fea?
Pacerier
20
@Pacerier Al igual que la mayoría de las salidas de descompilación, es, por supuesto
Louis CAD
55
convertido de kotlin a java. Pero muestra un código extra. el código que incluso nunca escribí o escuché
Nauman Ash
20
esa opción no está habilitada, es de color gris. ¿Cómo lo habilito?
Vikas Pandey
8
@VikasPandey, Decompile Kotlin to Javaactualmente está habilitado solo para las clases compiladas de Kotlin .
Onik
39

Puede compilar Kotlin para bytecode, luego usar un desensamblador Java.

El descompilación se puede hacer dentro de IntelliJ Idea, o usando FernFlower https://github.com/fesh0r/fernflower (gracias @Jire)

No había una herramienta automatizada como lo comprobé hace un par de meses (y no hay planes para un AFAIK)

voddan
fuente
2
Como nota al margen, tenga en cuenta que los genéricos en el código generado pueden causar advertencias del compilador, ya que Kotlin permite algunas cosas que el compilador de Java no permite. Sin embargo, todavía funciona en código de bytes.
Jacob Zimmerman el
@voddan Creo que se está refiriendo a los genéricos reified, que no son una posibilidad en Java puro.
Jire
1
Los genéricos reificados de @Jire siempre están en línea, por lo que desde Java parecen referencias de clase normales
voddan el
3
Esto es de lo que estoy hablando stackoverflow.com/questions/34762029/…
Jacob Zimmerman
44
IntelliJ IDEA 2016.2: Menú / Herramientas / Kotlin / Mostrar Kotlin Bytecode, luego haga clic en el botón
Descompilar
7

Para convertir un Kotlinarchivo fuente en un Javaarchivo fuente que necesita (cuando está en Android Studio):

  1. Prensa Cmd- Shift- Aen un Mac, o pulse Ctrl- Shift- Aen una máquina Windows.

  2. Escriba la acción que está buscando: Kotlin Bytecodey elija Show Kotlin Bytecodedel menú.

ingrese la descripción de la imagen aquí

  1. Presione el Decompilebotón en la parte superior del Kotlin Bytecodepanel.

ingrese la descripción de la imagen aquí

  1. Ahora obtienes un archivo Java descompilado junto con el archivo Kotlin en una pestaña adyacente:

ingrese la descripción de la imagen aquí

Andy
fuente
1
¡Gracias Señor! Este buggy AS volvió a cambiar las herramientas normales (Herramientas> Kotlin> ...).
CoolMind
5

Compilo Kotlin para codificar en bytes y luego descompilo eso en Java. Compilo con el compilador de Kotlin y descompilo con cfr .

Mi proyecto esta aqui .

Esto me permite compilar esto:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

tailrec fun findFixPoint(x: Double = 1.0): Double =
        if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

A esto:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive;

public final class ExampleKt {
  public static final double findFixPoint(double x) {
    while (x != Math.cos(x)) {
      x = Math.cos(x);
    }
    return x;
  }

  public static /* bridge */ /* synthetic */ double findFixPoint$default(
      double d, int n, Object object) {
    if ((n & 1) != 0) {
      d = 1.0;
    }
    return ExampleKt.findFixPoint(d);
  }
}
Tomás Bjerre
fuente
4

Como @ louis-cad mencionó, "la fuente de Kotlin -> el código de bytes de Java -> la fuente de Java" es la única solución hasta ahora.

Pero me gustaría mencionar la forma, que prefiero: usar el descompilador Jadx para Android .

Permite ver el código generado para los cierres y, para mí, el código resultante es "más limpio" que uno del descompilador IntelliJ IDEA.

Normalmente cuando necesito ver el código fuente de Java de cualquier clase de Kotlin que hago:

  • Generar apk: ./gradlew assembleDebug
  • Abra apk usando Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

En esta GUI, la funcionalidad IDE básica funciona: búsqueda de clases, haga clic para ir a la declaración. etc.

Además, todo el código fuente podría guardarse y luego visualizarse utilizando otras herramientas como IntelliJ IDEA.

Alex
fuente
Buena, está disponible a través de Homebrew:brew install jadx
milosmns
2
  1. Abra el archivo Kotlin en Android Studio
  2. ir a herramientas -> kotlin -> kotlin bytecode
  3. en la nueva ventana que se abre al lado de su archivo kotlin, haga clic en el botón descompilar. creará el equivalente java de su archivo kotlin.

fuente
2

Java y Kotlin se ejecutan en Java Virtual Machine (JVM).

La conversión de un archivo Kotlin a un archivo Java implica dos pasos, es decir, compilar el código Kotlin en el código de bytes JVM y luego descompilar el código de bytes en el código Java.

Pasos para convertir su archivo fuente Kotlin a un archivo fuente Java:

  1. Abra su proyecto Kotlin en Android Studio.
  2. Luego navegue a Herramientas -> Kotlin -> Mostrar código de bytes de Kotlin.

ingrese la descripción de la imagen aquí

  1. Obtendrá el bytecode de su archivo Kotin.
  2. Ahora haga clic en el botón Descompilar para obtener su código Java del código de bytes
Faxriddin Abdullayev
fuente