我在现有的Java项目中有简单的Kotlin代码
class A(val p: Int)
fun main() {
println("Hello World")
println(A::javaClass)
println(A::p)
}但是,这会引发异常。
Exception in thread "main" java.lang.NoSuchMethodError: 'void kotlin.jvm.internal.PropertyReference1Impl.<init>(java.lang.Class, java.lang.String, java.lang.String, int)'
at mloop.kt.graphql.TestKt$main$1.<init>(Test.kt)
at mloop.kt.graphql.TestKt$main$1.<clinit>(Test.kt)
at mloop.kt.graphql.TestKt.main(Test.kt:10)
at mloop.kt.graphql.TestKt.main(Test.kt)build.gradle.kts也很简单
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.7.20"
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.20")
}
tasks.test {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17"
}验证kotlin-reflect也在runtimeClassPath中列出。但是,相同的代码只适用于Kotlin项目。
compileClasspath - Compile classpath for compilation 'main' (target (jvm)).
+--- org.slf4j:slf4j-api -> 2.0.3
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+--- org.jetbrains.kotlin:kotlin-reflect:1.7.20
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
\--- org.projectlombok:lombok:1.18.24
runtimeClasspath - Runtime classpath of compilation 'main' (target (jvm)).
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+--- org.jetbrains.kotlin:kotlin-reflect:1.7.20
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+--- org.jetbrains.kotlin:kotlin-reflect:{strictly 1.7.20} -> 1.7.20 (c)
+--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
+--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)发布于 2022-10-26 15:12:34
使用::class.java而不是::javaClass。
文档中并不清楚这一点,但是对于基本属性、函数和类引用,您不需要kotlin-reflect库。您只需要它来实现更深层次的特性,比如获取类/属性/函数成员或描述符。传递KClasses、KProperties和KFunction实例或调用它们不需要库。
发布于 2022-10-26 15:10:43
这听起来更像是运行时和编译类中kotlin stdlib的不匹配,而不是与反射相关的东西(但我对反射不太熟悉,所以我可能错了)。
看起来就像有签名的方法
PropertyReference1Impl(java.lang.Class, java.lang.String, java.lang.String, int)在kotlin 1.4中添加,也请参阅这以获得相同错误的另一个示例。
不过,不太确定kotlin < 1.4是从哪里来的,您是否使用了一个旧的gradle版本(虽然我甚至不确定这是否重要)?
还请将完整的堆栈跟踪添加到问题中,而不是仅显示一行,这将显示试图调用缺失方法的确切内容。
发布于 2022-10-27 07:33:16
经过大量的依赖检查之后,我发现com.newrelic.logging:logback:2.5.0打破了java <-> kotlin反射,升级到2.6.0修复了它。
https://stackoverflow.com/questions/74209447
复制相似问题