Java 有没有办法在GraalVM本机映像中使用kotlin.random.random
我尝试用Kotlin构建一个简单的应用程序,在GraalVM本机映像上使用Kotlin.random.random类。 但这在运行时失败。见下文 作为一种变通方法,您可以使用java标准java.util.Random类 有人能告诉我如何使用Kotlin类型吗 App.ktJava 有没有办法在GraalVM本机映像中使用kotlin.random.random,java,kotlin,graalvm,graalvm-native-image,Java,Kotlin,Graalvm,Graalvm Native Image,我尝试用Kotlin构建一个简单的应用程序,在GraalVM本机映像上使用Kotlin.random.random类。 但这在运行时失败。见下文 作为一种变通方法,您可以使用java标准java.util.Random类 有人能告诉我如何使用Kotlin类型吗 App.kt import kotlin.random.Random fun main(args: Array<String>) { println(Random.nextInt()) } 运行时错误 Excepti
import kotlin.random.Random
fun main(args: Array<String>) {
println(Random.nextInt())
}
运行时错误
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:290)
at java.lang.Class.ensureInitialized(DynamicHub.java:475)
at kotlin.random.Random.<clinit>(Random.kt:242)
at com.oracle.svm.core.hub.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:350)
at com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:270)
at com.example.AppKt.main(App.kt:8)
Caused by: java.lang.InstantiationException: Type `kotlin.internal.jdk8.JDK8PlatformImplementations` can not be instantiated reflectively as it does not have a no-parameter constructor or the no-parameter constructor has not been added explicitly to the native image.
at java.lang.Class.newInstance(DynamicHub.java:793)
at kotlin.internal.PlatformImplementationsKt.<clinit>(PlatformImplementations.kt:41)
... 6 more
线程“main”java.lang.ExceptionInInitializeError中的异常
位于com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:290)
ensureInitialized(DynamicHub.java:475)
在科特林。随机。随机。(随机。kt:242)
位于com.oracle.svm.core.hub.ClassInitializationInfo.InvokeClassiInitializer(ClassInitializationInfo.java:350)
位于com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:270)
在com.example.AppKt.main上(App.kt:8)
原因:java.lang.InstanceException:Type`kotlin.internal.jdk8.jdk8PlatformImplements`无法反射式实例化,因为它没有无参数构造函数,或者没有将无参数构造函数显式添加到本机映像中。
位于java.lang.Class.newInstance(DynamicHub.java:793)
在科特林。内部。平台实施SKT。(平台实施kt:41)
... 还有6个
最小工作示例项目您必须修改
将以下内容添加到本机映像参数:
-H:ReflectionConfigurationFiles=/path/to/reflectconfig
并将受影响类的规则放入reflectionconfig文件:
[{
"name" : "kotlin.internal.jdk8.JDK8PlatformImplementations",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredFields" : true,
"allPublicFields" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
}]
或者,您也可以使用相同的文件指定init方法,我没有使用Kotlin,但我怀疑您需要在
本机映像调用中包含Kotlin库。
看起来Kotlin正在使用反射,您可能必须使用。
[{
"name" : "kotlin.internal.jdk8.JDK8PlatformImplementations",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredFields" : true,
"allPublicFields" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
}]