Estoy aprendiendo Kotlin y tengo un problema con este código:
import kotlin.reflect.*
fun main(args: Array<String>) {
val lst = listOf(1,2,3,45,5,6,7,8)
val mapped = lst.map {Data(::isEven,it)}
for(item in mapped){
var result = item.func.call(item.param)
println("$result ${item.func} ${item.param}")
}
}
fun isEven(number: Int):Boolean{
return number%2==0;
}
class Data(val func: KFunction<Any>,val param:Any)
Mi build.gradle se ve así:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4.31'
id 'application'
}
group = 'me.janva'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.4.31'
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
}
test {
useJUnit()
}
compileKotlin {
kotlinOptions.jvmTarget = '1.8'
}
compileTestKotlin {
kotlinOptions.jvmTarget = '1.8'
}
application {
mainClassName = 'MainKt'
}
Intenté buscarlo en Google, pero solo encontré soluciones con "implementación" dependencia que no me funciona.
¿Cómo puedo hacer que este programa se ejecute?
Ahora, si compilo este código en IntelliJ, se ejecuta cuando falla con esto:
C:\Users\janva\OpenJdks\jdk-15.0.2\bin\java.exe -javaagent:C:\Users\janva\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-03.7717.56\lib\idea_rt.jar=52396:C:\Users\janva\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-03.7717.56\bin -Dfile.encoding=UTF-8 -classpath E:\projects\ReflectionTest\build\classes\kotlin\main;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk8.4.31\e613be5465ef1e6fd0468707690b7ebf625ea2fe\kotlin-stdlib-jdk8-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7.4.31ce8e85f6e84270b2b501d44e9f0ba6ff64fa71\kotlin-stdlib-jdk7-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib.4.31\a58e0fb9812a6a93ca24b5da75e4b5a0cb89c957\kotlin-stdlib-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-common.4.31dd50665802f54ba9bc3f70ecb20227d1bc81323\kotlin-stdlib-common-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations.09f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar MainKt
Exception in thread "main" kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath
at kotlin.jvm.internal.CallableReference.getReflected(CallableReference.java:98)
at kotlin.jvm.internal.FunctionReference.getReflected(FunctionReference.java:63)
at kotlin.jvm.internal.FunctionReference.getReflected(FunctionReference.java:12)
at kotlin.jvm.internal.CallableReference.call(CallableReference.java:161)
at MainKt.main(main.kt:8)
Process finished with exit code 1
1
kotlin-reflect no está en tu classpath. Si va a ejecutarlo de esa manera, utilizando bibliotecas explícitas y archivos .class sueltos, deberá agregar it a su ruta de clase. Pero es más común crear un archivo .jar y ejecutarlo desde allí; Si creas un 'fat jar' o .war que incluye sus dependencias, no necesitarás especificar ninguna de ellas manualmente.
- gidds
28/03/2021 a las 11:18
Estaba pensando que se supone que Gradle y la parte de dependencia para esto. De todos modos tienes razón. Descargué jar, lo agregué a classpath y ahora está funcionando. Incluso si elimino el archivo jar y la declaración, permanezco en "build.gradle". Tal vez solo se trataba de un archivo "build.gradle" no sincronizado. archivo. Debo decir que esto es algo extraño para C#.programador :D
- Jan Válek
28/03/2021 a las 16:51
------------------------------------
El problema es que falta una dependencia en build.gradle.
Simplemente agregue lo siguiente para solucionarlo.
dependencies {
...
implementation "org.jetbrains.kotlin:kotlin-reflect"
...
}
------------------------------------
De alguna manera empezó a funcionar. Lo que hice fue:
descargue kotlin-reflect.jar desde el repositorio de Maven
siguiente en el archivo IntelliJ -> estructura del proyecto -> módulos -> las dependencias agregan la ruta al directorio con kotlin-reflect.jar - confirme Ok
ahora estaba funcionando.
elimine esta configuración, elimine el archivo descargado.
editar "build.gradle" inserte la dependencia o realice el mismo cambio y haga clic en sincronizar.
El proyecto está funcionando y puedo ver esta biblioteca reflejada en bibliotecas externas como dependencia de Gradle.
Como mencioné en la pregunta, estoy comenzando con "Kotlin-jvm" Así que supongo que esta es una solución subóptima, pero a mí me funciona.
Respondido
28 de marzo de 2021 a las 17:02
Jan Válek
Jan Válek
434
4
4 insignias de plata
15
15 insignias de bronce