如何获取数据类的相对类名称

发布于 2025-02-05 13:25:24 字数 453 浏览 1 评论 0原文

假设我们有这样的结构:

data class MyClass(
  val inner: MyInnerClass
) {
  data class MyInnerClass(
    val foo: String
  )
}

如何获得相对类名称myclass.myinnerclass?我已经有那个班级的ktype。而且,如果我使用调试器看这个名称:

”

我找不到如何使用代码访问它。

Suppose we have a structure like this:

data class MyClass(
  val inner: MyInnerClass
) {
  data class MyInnerClass(
    val foo: String
  )
}

How can I get the relative class name MyClass.MyInnerClass? I already have a KType of that class. And if I look at this with the debugger I can find the name:

screenshot of intellij debugger

I could not find out how to access this with code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北斗星光 2025-02-12 13:25:24

使用Kotlin反射伪像作为依赖性,这是可能的。
httpps://kotlinlang.org/docs/docs/reflection/reflection.html#jvm-dependence

在我的Maven项目中,我添加了一个新的依赖性:

<dependencies>
  <dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>1.7.0</version>
  </dependency>
</dependencies>

我没有为此使用Gradle,但我认为您会使用

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.0")
}

它。

我在名为innerClass的软件包中进行了类似于您的数据类:

package innerclass

data class MyClass(
    val inner: MyInnerClass
) {
    data class MyInnerClass(val foo:String)
    data class AnotherInnerClass(val bar:String)
}

然后我的main.kt看起来像这样:

import innerclass.MyClass
import kotlin.reflect.KClass

fun main(args: Array<String>) {
    println("Using class type as reference: ${MyClass::class.qualifiedName}")
    printRelativeClassNames(MyClass::class.nestedClasses)

    val test = MyClass(MyClass.MyInnerClass("foo"))
    println("\nUsing instance as reference: ${test::class.qualifiedName}")
    printRelativeClassNames(test::class.nestedClasses)
}

private val KClass<*>.packageFqName: String?
    get() {
        return java.`package`.name
    }

private val KClass<*>.relativeClassName: String?
    get() {
        return qualifiedName?.removePrefix("${packageFqName}.")
    }

fun printRelativeClassNames(nestedClasses: Collection<KClass<*>>) {
    nestedClasses.forEach {
        println("Actual Kotlin class: $it")
        println(it.relativeClassName)
    }
}

当我运行程序时,它会输出:

Using class type as reference: innerclass.MyClass
Actual Kotlin class: class innerclass.MyClass$AnotherInnerClass
MyClass.AnotherInnerClass
Actual Kotlin class: class innerclass.MyClass$MyInnerClass
MyClass.MyInnerClass

Using instance as reference: innerclass.MyClass
Actual Kotlin class: class innerclass.MyClass$AnotherInnerClass
MyClass.AnotherInnerClass
Actual Kotlin class: class innerclass.MyClass$MyInnerClass
MyClass.MyInnerClass

使用反射(和一个小字符串操作)我可以获取Kotlin类,并打印出班级的相对名称。

让我知道您是否遇到任何问题。

This is possible using the kotlin-reflect artifact as a dependency.
https://kotlinlang.org/docs/reflection.html#jvm-dependency

In my Maven project I add a new dependency:

<dependencies>
  <dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>1.7.0</version>
  </dependency>
</dependencies>

I didn't use Gradle for this, but I think you'd use

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.0")
}

to include it.

I made a data class similar to yours in a package named innerclass:

package innerclass

data class MyClass(
    val inner: MyInnerClass
) {
    data class MyInnerClass(val foo:String)
    data class AnotherInnerClass(val bar:String)
}

Then my Main.kt looks like this:

import innerclass.MyClass
import kotlin.reflect.KClass

fun main(args: Array<String>) {
    println("Using class type as reference: ${MyClass::class.qualifiedName}")
    printRelativeClassNames(MyClass::class.nestedClasses)

    val test = MyClass(MyClass.MyInnerClass("foo"))
    println("\nUsing instance as reference: ${test::class.qualifiedName}")
    printRelativeClassNames(test::class.nestedClasses)
}

private val KClass<*>.packageFqName: String?
    get() {
        return java.`package`.name
    }

private val KClass<*>.relativeClassName: String?
    get() {
        return qualifiedName?.removePrefix("${packageFqName}.")
    }

fun printRelativeClassNames(nestedClasses: Collection<KClass<*>>) {
    nestedClasses.forEach {
        println("Actual Kotlin class: $it")
        println(it.relativeClassName)
    }
}

When I run the program, it outputs:

Using class type as reference: innerclass.MyClass
Actual Kotlin class: class innerclass.MyClass$AnotherInnerClass
MyClass.AnotherInnerClass
Actual Kotlin class: class innerclass.MyClass$MyInnerClass
MyClass.MyInnerClass

Using instance as reference: innerclass.MyClass
Actual Kotlin class: class innerclass.MyClass$AnotherInnerClass
MyClass.AnotherInnerClass
Actual Kotlin class: class innerclass.MyClass$MyInnerClass
MyClass.MyInnerClass

Using reflection (and a little string manipulation) I can get the Kotlin class as well as print out the relative name of the class.

Let me know if you hit any issues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文