首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin中的简单反射在现有的Java项目中不起作用

Kotlin中的简单反射在现有的Java项目中不起作用
EN

Stack Overflow用户
提问于 2022-10-26 14:26:59
回答 3查看 74关注 0票数 0

我在现有的Java项目中有简单的Kotlin代码

代码语言:javascript
复制
class A(val p: Int)

fun main() {
    println("Hello World")
    println(A::javaClass)
    println(A::p)
}

但是,这会引发异常。

代码语言:javascript
复制
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也很简单

代码语言:javascript
复制
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项目。

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2022-10-26 15:12:34

使用::class.java而不是::javaClass

文档中并不清楚这一点,但是对于基本属性、函数和类引用,您不需要kotlin-reflect库。您只需要它来实现更深层次的特性,比如获取类/属性/函数成员或描述符。传递KClasses、KProperties和KFunction实例或调用它们不需要库。

票数 1
EN

Stack Overflow用户

发布于 2022-10-26 15:10:43

这听起来更像是运行时和编译类中kotlin stdlib的不匹配,而不是与反射相关的东西(但我对反射不太熟悉,所以我可能错了)。

看起来就像有签名的方法

代码语言:javascript
复制
PropertyReference1Impl(java.lang.Class, java.lang.String, java.lang.String, int)

kotlin 1.4中添加,也请参阅以获得相同错误的另一个示例。

不过,不太确定kotlin < 1.4是从哪里来的,您是否使用了一个旧的gradle版本(虽然我甚至不确定这是否重要)?

还请将完整的堆栈跟踪添加到问题中,而不是仅显示一行,这将显示试图调用缺失方法的确切内容。

票数 0
EN

Stack Overflow用户

发布于 2022-10-27 07:33:16

经过大量的依赖检查之后,我发现com.newrelic.logging:logback:2.5.0打破了java <-> kotlin反射,升级到2.6.0修复了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74209447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档